Autor | Zpráva | ||
---|---|---|---|
Daniel01 Profil |
#1 · Zasláno: 8. 6. 2009, 11:30:40
Ahoj, jak můžu pomocí jednoho dotazu smazat více řádků s id (auto_increment)?
Předem samozřejmě nebudu vědět, kolik řádků budu mazat. Čísla budu mít uložena v proměnných - $1 == 1; $2 == 2; atd... |
||
ninja Profil |
#2 · Zasláno: 8. 6. 2009, 11:44:53
DELETE FROM tabulka WHERE id IN (1,2,3,5,10); |
||
Daniel01 Profil |
#3 · Zasláno: 8. 6. 2009, 12:22:09
ale jak tam mám dostat ty proměnné?
|
||
Nox Profil |
#4 · Zasláno: 8. 6. 2009, 12:30:11
Daniel01
Ty proměnné máš vymyšlené dost špatně...dej to do pole, pak budeš mít třeba $delete=array(5,7,12,16); mysql_query("DELETE FROM tabulka WHERE id IN (".implode(",",$delete).")"); |
||
DJ Miky Profil |
#5 · Zasláno: 8. 6. 2009, 12:30:27 · Upravil/a: DJ Miky
Nejlepší bude, kdybys místo těch proměnných $1, $2 (mimochodem, to nejsou platné názvy) použil pole:
$smazat = array(1, 2, 3, 5, 10); mysql_query('DELETE FROM tabulka WHERE id IN ('. implode(',',$smazat) .')'); EDIT: 16 sekund... :-/ |
||
Daniel01 Profil |
#6 · Zasláno: 8. 6. 2009, 12:50:01
Jakto, že to nejsou platné názvy?
No, tak to bude asi problém... Uživatel si zvolí, co chce smazat... Může tam být třeba i 100 řádků. Jsou tam checkboxy a name mají smyčkou vypisované ID. Nemůžu dát do pole proměnné, když nevím kolik jich bude, ne? |
||
panther Profil |
#7 · Zasláno: 8. 6. 2009, 12:52:16
Daniel01
„Jakto, že to nejsou platné názvy? “ protože nesmí začínat číslicí. „Čísla budu mít uložena v proměnných - $1 == 1;“ když přiřazuješ, píše se jen jedno rovnítko. Dvě jsou porovnání. |
||
Nox Profil |
#8 · Zasláno: 8. 6. 2009, 12:55:01
Daniel01
Jasně že můžeš, naopak to je výhoda polí...checkoxy si dej stylem <input type="checkbox" name="delete[]"> a budeš to mít automaticky v poli |
||
DJ Miky Profil |
#9 · Zasláno: 8. 6. 2009, 12:59:29
Ale můžeš je dát do pole, když si ty checkboxy pojmenuješ třeba
name="smazat[id]" Pak stačí mysql_query('DELETE FROM tabulka WHERE id IN ('. implode(',',array_walk(array_keys($_POST['smazat'])),'intval') .')'); |
||
Daniel01 Profil |
#10 · Zasláno: 8. 6. 2009, 13:06:13 · Upravil/a: Daniel01
<?PHP $sql = mysql_query("SELECT"); while ( $i == mysql_fetch_array($sql) ) { ?> <input type="checkbox" name="<?PHP echo ?; ?>" value="on"> <?PHP } ?> Co mám vypsat? Cože? :-o 16 sekund trvá dotaz? |
||
panther Profil |
#11 · Zasláno: 8. 6. 2009, 13:13:43
Daniel01
„Cože? :-o 16 sekund trvá dotaz?“ :-) To by byla doba... Jestli reaguješ na tenDJ Mikyho edit, poslal shodný příspěvek jako Nox, jen o 16 sekund později. |
||
DJ Miky Profil |
#12 · Zasláno: 8. 6. 2009, 13:35:45
name="smazat[<?php echo $i['id']; ?>]" za předpokladu, že sloupec s id máš pojmenovaný id. Jak říká panther, poslal jsem téměř stejný příspěvek, ale Nox mi to o 16 sekund dřív vyfouknul... |
||
Daniel01 Profil |
#13 · Zasláno: 8. 6. 2009, 14:33:48 · Upravil/a: Daniel01
A co mám dát do value??
|
||
Daniel01 Profil |
#14 · Zasláno: 8. 6. 2009, 23:50:14
Protože takhle mi to vypíše: delete[454]=on
|
||
AM_ Profil |
#15 · Zasláno: 9. 6. 2009, 00:08:00
„Protože takhle mi to vypíše: delete[454]=on“
a to je špatně? |
||
Daniel01 Profil |
#16 · Zasláno: 9. 6. 2009, 08:02:21
A jak si to v PHP vyzvednu? O posílání polí moc toho nevím...
Jsem zvyklej prostě $_POST["name"] |
||
AM_ Profil |
#17 · Zasláno: 9. 6. 2009, 09:35:08 · Upravil/a: AM_
|
||
Daniel01 Profil |
#18 · Zasláno: 9. 6. 2009, 22:08:36
echo array_keys($_POST["delete"]); Pořád mi to píše Array co dělám špatně? |
||
AM_ Profil |
#19 · Zasláno: 9. 6. 2009, 22:18:44
pole nemůžeš vypisovat pomocí echa, k přehlednému výpisu složitějších typů proměnných slouží funkce var_dump, print_r nebo var_export
|
||
Daniel01 Profil |
#20 · Zasláno: 10. 6. 2009, 10:18:55
Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/free/hu.cz/n/note/root/www/messages.php on line 112
Warning: array_walk() expects at least 2 parameters, 1 given in /home/free/hu.cz/n/note/root/www/messages.php on line 112 Warning: Wrong parameter count for implode() in /home/free/hu.cz/n/note/root/www/messages.php on line 112 Na řádku 112 je dotaz na databázi, který posílalDJ Miky... |
||
AM_ Profil |
#21 · Zasláno: 10. 6. 2009, 10:36:29
implode(',',array_walk(array_keys($_POST['delete']),'intval'))
přehozená závorka v příkladu. to "delete" tě mohlo trknout, když tam bylo smazat a ty používáš $_POST['delete'] |
||
Daniel01 Profil |
#22 · Zasláno: 11. 6. 2009, 21:16:44
pořád ale přetrvává:
Warning: implode() [function.implode]: Bad arguments. in /home/free/hu.cz/n/note/root/www/messages.php on line 112 dotaz: mysql_query('DELETE FROM `messages` WHERE id IN ('.implode(',',array_walk(array_keys($_POST['delete']),'intval')).')'); Pořád ale nechápu, proč tam je array_walk a array_keys... proč tam nění jenom implode? |
||
AM_ Profil |
#23 · Zasláno: 11. 6. 2009, 21:23:23
aha, protože array_walk vrací boolean a pole mění přímo. Takže si někam ulož array_keys (do proměnné), pak na ni zavolej array_walk a pak až ji dosaď do implode.
|
||
Daniel01 Profil |
#24 · Zasláno: 11. 6. 2009, 21:28:18
Ptám se ještě jednou - proč tam je array_walk a array_keys... proč tam nění jenom implode?
mysql_query('DELETE FROM `messages` WHERE id IN ('" . implode("', '", $_POST['delete']) . "')"); |
||
AM_ Profil |
#25 · Zasláno: 11. 6. 2009, 21:37:36
array_walk s funkcí 'intval' ošetří nežádoucí vstupy, array_keys potřebuješ, protože požadované údaje jsou klíče a ne hodnoty pole. Můžeš to předělat na hodnoty když ty inputy budou vypadat
name="smazat[]" value="<?php echo $i['id']; ?>" |
||
Daniel01 Profil |
#26 · Zasláno: 11. 6. 2009, 21:53:40
chápu to teda dobře? :-)
$pole = array_keys($_POST['delete']); $pole2 = array_walk($pole); mysql_query('DELETE FROM `messages` WHERE id IN ('" . implode("', '", $pole2 , 'intval') . "')"); |
||
AM_ Profil |
#27 · Zasláno: 11. 6. 2009, 21:59:56
intval patří k array_walk jako druhý parametr :) je to funkce, která aplikuje jinou funkci (intval) na všechny prvky pole
|
||
Daniel01 Profil |
#28 · Zasláno: 11. 6. 2009, 22:07:17
ahá...
$pole2 = array_walk($pole,'intval'); a SQL dotaz? mysql_query('DELETE FROM `messages` WHERE id IN ('" . implode("', '", $pole2) . "')"); |
||
AM_ Profil |
#29 · Zasláno: 11. 6. 2009, 22:23:09
ne, říkal jsem, že array_walk přepisuje přímo to pole a vrací boolean - takže bez "$pole2 ="
|
||
Daniel01 Profil |
#30 · Zasláno: 11. 6. 2009, 22:55:15
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /home/free/hu.cz/n/note/root/www/messages.php on line 118
mysql_query('DELETE FROM `messages` WHERE `id` IN ('" . implode("', '", $id_delete) . "')'); |
||
Téma pokračuje na další straně.
|
0