MySQL, sor torlese utan hogyan indexelek ujra?
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:
■ 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>";
?>
Miért?
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.
Autoincrement
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.
Adatbázis
Én is amondó vagyok, inkább írd le a megdoldandó feladatot.
a megoldando feladat
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.
még mindig homályos
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á.
torles-problema megoldva rekurziv fuggveny segitsegevel
megoldottam:
tehat a kovetkezo sorra lepest kiegeszitettem egy rekurziv fugvennyel, es kicsiket leegyszerusitettem:
ouch...
koszi..
naponta valtozo tartalom mysql-bol
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:
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.. ;)