« 1 2 »
Autor Zpráva
Daniel01
Profil
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
DELETE FROM tabulka WHERE id IN (1,2,3,5,10);
Daniel01
Profil
ale jak tam mám dostat ty proměnné?
Nox
Profil
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
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);
a potom použít funkci implode():
mysql_query('DELETE FROM tabulka WHERE id IN ('. implode(',',$smazat) .')');


EDIT: 16 sekund... :-/
Daniel01
Profil
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
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
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
Ale můžeš je dát do pole, když si ty checkboxy pojmenuješ třeba
name="smazat[id]"
Např.: smazat[1], smazat[2], ...
Pak stačí
mysql_query('DELETE FROM tabulka WHERE id IN ('. implode(',',array_walk(array_keys($_POST['smazat'])),'intval') .')');
(toto konkrétně má i jakousi ochranu proti SQL injection)
Daniel01
Profil
<?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
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
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
A co mám dát do value??
Daniel01
Profil
Protože takhle mi to vypíše: delete[454]=on
AM_
Profil
Protože takhle mi to vypíše: delete[454]=on
a to je špatně?
Daniel01
Profil
A jak si to v PHP vyzvednu? O posílání polí moc toho nevím...
Jsem zvyklej prostě
$_POST["name"] 
- a tam mám uloženou hodnotu (v tomto případě on)
AM_
Profil
[#9] ti to už napsali.
bude to konkrétně
array_keys($_POST['delete'])
Daniel01
Profil
echo array_keys($_POST["delete"]);


Pořád mi to píše Array co dělám špatně?
AM_
Profil
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
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
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
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
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
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
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
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
intval patří k array_walk jako druhý parametr :) je to funkce, která aplikuje jinou funkci (intval) na všechny prvky pole
Daniel01
Profil
ahá...
$pole2 = array_walk($pole,'intval');


a SQL dotaz?
mysql_query('DELETE FROM `messages` WHERE id IN ('" . implode("', '", $pole2) . "')");
AM_
Profil
ne, říkal jsem, že array_walk přepisuje přímo to pole a vrací boolean - takže bez "$pole2 ="
Daniel01
Profil
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) . "')');
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: