ugrás a tartalomhoz

MySQL, sor torlese utan hogyan indexelek ujra?

eaposztrof · 2007. Dec. 6. (Cs), 05.40
udv..
egy MySQL tabla torlese utan hogyan indexelek ujra, legalabbis el a leglogikusabb megfogalmazas szerintem arra hogy a sorokat ujraszamozzam.

a lenyeg, hogy az alabbi scriptem mukodjon akkor is ha sorokat torlok:

<?php
include("config.php");
mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);

// igy nez ki a sorom
mysql_query("
	CREATE TABLE IF NOT EXISTS `dailynews` (
	`id` int(11) NOT NULL auto_increment,
	`name` varchar(40) NOT NULL default '',
	`content` text NOT NULL default '',
	`image` varchar(40) NOT NULL default '',
	`ins_date` date NOT NULL default '0000-00-00',
	`status` enum('on','off') NOT NULL default 'on',
	`show_date` date NOT NULL default '0000-00-00',
	PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1");

$tday_date=date('Y-m-d');

$result = mysql_query("SELECT id,show_date FROM dailynews WHERE show_date != '0000-00-00' ");
$row = mysql_fetch_assoc($result);
// ha van olyan sor amelynek 'show_date'-ja nem '0000-00-00', es az nem a mai datum akkor
// lenullazza azt es az aktualis datumot hozzaadja a kovetkezo sorhoz ('id'+1)
if ($row) {
	$arow=$row['show_date'];
	$aid=$row['id']+1;
		if ($arow!=$tday_date) {
				mysql_query("UPDATE dailynews SET show_date='0000-00-00' WHERE show_date='$arow'");
				mysql_query("UPDATE dailynews SET show_date='$tday_date' WHERE id='$aid'");
		}
$result = mysql_query("SELECT name,content,image FROM dailynews WHERE show_date = '$tday_date' ");
$row = mysql_fetch_assoc($result);
}
// ha nem letezik 'show_date' amely nem '0000-00-00', letrehoz egyet, es meghivja az elso sort ('id'=1)
if (!$row) {
	mysql_query("UPDATE dailynews SET show_date='$tday_date' WHERE id='1'");
	$result = mysql_query("SELECT name,content,image FROM dailynews WHERE id = '1' ");
	$row = mysql_fetch_assoc($result);
}

		echo " <center><h2>$row[name]</h2></center><p>";
		if($row['image']){
			echo "<img src=\"".$row['image']."\" align=right>";
		};
		echo $row['content'];
		echo "</p>";
?>
 
1

Miért?

janoszen · 2007. Dec. 6. (Cs), 08.12
Miért érzed hogy újra kéne számoznod a sorokat? Jól értem, hogy ezt akarod, ugye?

Az auto_increment lényege nem a folyamatos számozás, hanem az egyedi számozás.

Gondolj bele. Két ember használja a programot. Az egyik lekéri az admin oldalt, amivel lehet mondjuk törölni, megkapja annak a sornak az ID-ját, amit törölni szeretne. Közben valaki más töröl egy sort, ettől újraszámozódik az egész tábla. Mire az első emberünk megnyomja a törlés gombot, az adott ID egy tök más sort fog jelenteni.

Ergó, szerintem gondold újra hogy mit szeretnél megvalósítani és hogyan, aztán tedd föl a kérdést és ne az általad elképzelt megoldást rá, hátha úgy jobban tudunk segíteni.
3

Autoincrement

Wabbitseason · 2007. Dec. 6. (Cs), 11.16
Az auto_increment lényege nem a folyamatos számozás, hanem az egyedi számozás.

Pontosan így van. R937 --- r937.com -- véleménye szerint ha nem lehetne egy autoincrementes mezőt véletlenszerű, de egyedi értékekkel helyettesíteni, akkor azt az adatbázis-struktúrát rosszul tervezték meg.
2

Adatbázis

vbence · 2007. Dec. 6. (Cs), 10.09
Eléggé rosszul közelíted meg a problémát, bármi is legyen az. Az adatbázis okosabb, mint gondolod, ne úgy kezeld, mint egy text fájlt, amiben kézzel kell elvégezned minden egyes módosítást.

Én is amondó vagyok, inkább írd le a megdoldandó feladatot.
4

a megoldando feladat

eaposztrof · 2007. Dec. 11. (K), 09.47
igazatok van, nem ugy alltam neki h elore atgondoljam a folyamatot, mivel mar el volt kezdve a program es csak folytatni akartam.

rendben, megoldando feladat:
kell egy modul, ami minden nap mas tartalmat jelenit meg.
a feltoltott tartalmakat rotacioban jelenitse meg, tehat ha vegere ert, kezdje elolrol.
tartalmakat lehesssen hozzaadni, szerkeszteni, torolni, es sorrendet valtoztatni.
5

még mindig homályos

vbence · 2007. Dec. 11. (K), 13.28
Én a sorrendet semmiképp sem az id-vel írnám le, hanem egy másik, mondjuk egy pos nevű mezőben.

Az utolsó elküldött elem helyének megállípítása nehéz, ha közben összevissza rendezedezheted is őket. Mire gondolok: Mi van, ha minden nap az utolsó elküldött pozícióját tárolod le? Mindaddig semmi probléma, amég nem mozgatod el onnan az elemet. Viszont beszúrsz elé, akkor viszont felborul az egész rendszer (kimegy újra tegnapi elem).

Ha az utolsó elem id-jét tárolod, akkor a beszúrás nem lesz problémás, viszont ha épp ezt az elemet mozgatod el, akkor szintén megbolondul a rendszer.

A legjobb megoldás talán, ha az utolsó küldés dátumára hagyatkozol. Mindig azok mennek ki (mondjuk 10 darab), ami a legrégebben voltak elküldve. Ha a dátumot nullára állítod valahol, akkor az az elem biztosan kimegy a következő turnusban. (Hacsak nincs 10nél több ilyen elem, mert ugye ha ennyiben van maximálva akkor nem biztos, hogy beleesik).

Ennél a megoldásnál viszont nem tudod időzíteni, például, hogy holnapután menjen ki, vagy rendezni (az xy rekord után menjen ki), őket.

Ennél még részletesebben, illetve a megrendelővel egyeztetve kéne tisztázni ezeket a kérdéseket. Ha egy olyan megoldást akarsz sinálni, ami minden funkciót támogat, akkor sok fölösleges munkát fogsz végezni, illetve fölöslegesen növeled a rendszer bonyolultságát, így a hibalehetőségeket is. Azt ajánlom, hogy tisztázd (példákon keresztül) a feladatot a megbízóval, és ezután kezdj hozzá.
6

torles-problema megoldva rekurziv fuggveny segitsegevel

eaposztrof · 2007. Dec. 12. (Sze), 08.10
koszonom azt a nagyon sok segitseget amit adtatok..

megoldottam:

tehat a kovetkezo sorra lepest kiegeszitettem egy rekurziv fugvennyel, es kicsiket leegyszerusitettem:
// az aktualis datum definialasa
$tday_date=date('Y-m-d');

//rekurziv fugveny a hianyzo sor atugrasara
function select_id($id){
	$result = mysql_query("SELECT id FROM dailynews WHERE id='$id'");
	if (mysql_num_rows($result)==0) {
		return select_id($id+1);
	} else {
		return $id;
	}
}
// meghivom a datummal jelzett sort
$result = mysql_query("SELECT id,name,header,content,script,image,show_date FROM dailynews WHERE show_date != '0000-00-00' ");
$row = mysql_fetch_assoc($result);
// ha nincs datummal jelzett sor akkor az elsot jelzem az aktualis datummal
if (mysql_num_rows($result)==0) {
	mysql_query("UPDATE dailynews SET show_date='$tday_date' WHERE id='1'");
}
// ellenorzom hogy a sor az aktualis datummal rendelkezik-e
$arow=$row['show_date'];
if ($arow!=$tday_date) {
	$aid=select_id($row['id']+1);
	// lenullazom az elozo sor datumat
   	mysql_query("UPDATE dailynews SET show_date='0000-00-00' WHERE show_date='$arow'");
	// aktualis datumot rendelem a kovetkezohoz
	mysql_query("UPDATE dailynews SET show_date='$tday_date' WHERE id='$aid'");
}
meg csak azt nem tudtam megoldani, hogy ha az utolso sor mar nem az aktualis datumot tartalmazza, akkor az elso sortol kezdje, ugyanis a select_id() fugveny meghivasanal elakad.
7

ouch...

amonrpg · 2007. Dec. 12. (Sze), 09.25
ezt felejtsd el... nagyon lassú, és feleslegesen terheli a szervereket... (db és frontendet is, ha ugyanaz a kettő, akkor meg pláne)
# //rekurziv fugveny a hianyzo sor atugrasara  
function select_id($id){  
    $result = mysql_query("SELECT id FROM dailynews WHERE id='$id'");  
    if (mysql_num_rows($result)==0) {  
        return select_id($id+1);  
    } else {  
        return $id;  
    }  
}
helyett valami ilyesmit alkalmazz:
// kovetkezo id kivalasztasa
function select_id($id){  
    $result = mysql_query("SELECT id FROM dailynews WHERE id>='$id' LIMIT 0,1");  
    if (mysql_num_rows($result)==0) {  
        // nincs kovetkezo id
        return null;
    } else {
        // van kovetkezo id
        return mysql_fetch_assoc( $result );
    }  
}
Persze a konkrét feladat ismeretében lehet van optimálisabb megoldás is.
8

koszi..

eaposztrof · 2007. Dec. 15. (Szo), 03.57
koszi.. ez sokkal ugyesebb megoldas..
9

naponta valtozo tartalom mysql-bol

eaposztrof · 2007. Dec. 15. (Szo), 04.08
ime a vegleges forma:

<?php
include("config.php");
mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);

/* //
mysql_query("
CREATE TABLE IF NOT EXISTS `dailynews` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(40) NOT NULL default '',
`header` text NOT NULL default '',
`content` text NOT NULL default '',
`script` text NOT NULL default '',
`image` varchar(40) NOT NULL default '',
`ins_date` date NOT NULL default '0000-00-00',
`status` enum('on','off') NOT NULL default 'on',
`show_date` date NOT NULL default '0000-00-00',
PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1");
*/ //

$tday_date=date('Y-m-d');

function select_id($id){
$result = mysql_query("SELECT id FROM dailynews WHERE id>='$id' AND status !='off' LIMIT 0,1");
if (mysql_num_rows($result)==0) {
return null;
} else {
return mysql_fetch_assoc( $result );
}
}

$result = mysql_query("SELECT id,name,header,content,script,image,status,show_date FROM dailynews WHERE show_date != '0000-00-00' AND status !='off'");
$row = mysql_fetch_assoc($result);
if (mysql_num_rows($result)==0) {
mysql_query("UPDATE dailynews SET show_date='$tday_date' WHERE id='1'");
}

$arow=$row['show_date'];
if ($arow!=$tday_date) {
$aid=select_id($row['id']);
print_r('['.$aid.']');
    mysql_query("UPDATE dailynews SET show_date='0000-00-00' WHERE show_date='$arow' LIMIT 1");
mysql_query("UPDATE dailynews SET show_date='$tday_date' WHERE id='$aid' LIMIT 1");
}

echo "<center><h2> asd </h2></center><p>";
if($row['image']){
echo "<img src=\"".$row['image']."\" align=right>";
}
echo $row['header'];
echo "<center><strong>$row[name]</strong></center><p>";
echo "<table width=\"99%\" cellspacing=0 cellpadding=0 align=center>";
echo "<tbody><tr valign=middle><td valign=top align=left>";
echo $row['content'];
echo "</td><td width=5 align=center></td><td align=center width=90 height=90>";
echo $row['script'];
echo "</td></tr></tbody></table>";
?>


es az admi hozza:

<?php
include("config.php");
@mysql_connect($dbhost,$dbuser,$dbpass);
@mysql_select_db($dbname);

if ($_GET['edit']) {
$result = mysql_query("select * from dailynews where id='$_GET[edit]'");
$row = mysql_fetch_assoc($result);

} else unset($row);

$header="ritkabban valtozo headertext";
$tday_date=date('Y-m-d');
?>
<form method=post action="./">
<input type=hidden name=editid value="<?=$_GET['edit']?>">
<table>
<tr><td>header</td><td><textarea name=header cols=50 rows=5><?=$_GET['edit']?$row['header']:$header?></textarea></td></tr>
<tr><td>submitted date</td><td><input type=text name=ins_date value=<?=$_GET['edit']?$row['ins_date']:date('Y-m-d')?>></td></tr>
<tr><td>title</td><td><input type=text size=60 name=name value="<?=htmlentities($row['name'])?>"></td></tr>
<tr><td>content</td><td><textarea name=content cols=50 rows=5><?=$row['content']?></textarea></td></tr>
<tr><td>script</td><td><textarea name=script cols=50 rows=5><?=$row['script']?></textarea></td></tr>
<tr><td>image</td><td><input type=text size=60 name=image value="<?=htmlentities($row['image'])?>"></td></tr>
<? if($_GET['edit'] && $row['show_date']=='$tday_date') {?>
<? } else {?>
<tr><td>status</td><td><input type=radio name=status value="on" <? if($row['status']=='on') echo "checked"?>>on<input type=radio name=status value="off" <? if($row['status']=='off') echo "checked"?>>off</td></tr>
<? }?>
<tr><td colspan=2 align=center><input type=submit name=<?=$_GET['edit']?"editold":"addnew"?> value="submit"></td></tr>
</table>
</form>
<a href="index.php">clear text</a><br><br><hr><br>
<?
if ($_POST['addnew']) {
mysql_query("insert into dailynews (ins_date,name,header,content,script,image,status) values('$_POST[ins_date]','$_POST[name]','$_POST[header]','$_POST[content]','$_POST[script]','$_POST[image]','$_POST[status]')");
}
if ($_POST['editold']) {
mysql_query("update dailynews set ins_date='$_POST[ins_date]',name='$_POST[name]',header='$_POST[header]',content='$_POST[content]',script='$_POST[script]',image='$_POST[image]',status='$_POST[status]' where id='$_POST[editid]'");
}
if ($_GET['del']) {
mysql_query("delete from dailynews where id='$_GET[del]'");
}
if ($_GET['edit']) {
echo "";
} else if ($_GET['show']) {
$result = mysql_query("select * from dailynews ORDER BY id DESC");
} else {
$result = mysql_query("select * from dailynews ORDER BY id DESC LIMIT 1");
}
if ($_GET['show']=="current") {
$result = mysql_query("select * from dailynews ORDER BY show_date DESC LIMIT 1");
} else {
$result = mysql_query("select * from dailynews ORDER BY id DESC LIMIT 1");
}

while ($row = mysql_fetch_assoc($result)) {

echo "<center><h2> asd </h2></center><p>";
if($row['image']){
echo "<img src=\"".$row['image']."\" align=right>";
}
echo $row['header'];
echo "<center><strong>$row[name]</strong></center><p>";
echo "<table width=\"99%\" cellspacing=0 cellpadding=0 align=center>";
echo "<tbody><tr valign=middle><td valign=top align=left>";
echo $row['content'];
echo "</td><td width=5 align=center></td><td align=center width=90 height=90>";
echo $row['script'];
echo "</td></tr></tbody></table>";
echo "<br><hr>";
echo $row[id]." | ";
echo "<a href=index.php?edit=$row[id]>edit</a> | ";
echo "<a href=index.php?del=$row[id]>delete</a> | ";
if ($row['status']!='off') {
echo "status: <b>on</b> | ";
} else {
echo "status: <b>off</b> | ";
}
echo "included date: $row[ins_date]";
if ($row['show_date']==$tday_date) {
echo " | <b>shown</b>";
}
}

if (!$_GET['show']) {
echo "<form method=post action=\"./?show=all\"><p><input type=submit value=showall></form>
 <form method=post action=\"./?show=current\"><p><input type=submit value=\"show current\"></form>";
}
if ($_GET['edit']) {
$result = mysql_query("select * from dailynews where id='$_GET[edit]'");
$row = mysql_fetch_assoc($result);

} else unset($row);
?>


lehet nevetni, sirni, akar hasznalni.. ;)