Autor | Zpráva | ||
---|---|---|---|
Xanomes_ Profil * |
#1 · Zasláno: 22. 8. 2017, 22:20:39
$query = "SELECT * FROM comments WHERE 0"; $articles = explode(",",$articles); while($i != 0){ $query = $query." OR `Article url` = '".$articles[$i-1]."'"; $i = $i-1; } $id = null; $result = mysqli_query($connect,$query); while ($row = mysqli_fetch_array($result)){ $id = $id.$row[7].","; $i++; } while($i != 0){ $id = explode(",",$id); $query = "DELETE FROM comments WHERE id = '".$id[$i-1]."'"; mysqli_query($connect,$query); $i = $i-1; } Ahoj, při spuštění následujícího kódu mi PHP hlásí chybu Warning: explode() expects parameter 2 to be string, array given in soubor.php on line 91 $id by měl být string. $row[7] je v databázi typu TEXT a obsahuje číslo, jako např. 5 . Tato chyba se děje pouze, pokud jsou nalezeny v databázi 2 odpovídající řádky, při jednom vše proběhne bez problémů.
|
||
M4n Profil * |
#2 · Zasláno: 22. 8. 2017, 22:42:09
$id = explode(",",$id); Jinak si udělej laskavost a pořiď si debugger. Odkrokovat si program a podívat se na hodnoty proměnné je přece elementární základ každého programování. |
||
Xanomes_ Profil * |
#3 · Zasláno: 22. 8. 2017, 22:50:53
M4n:
Doteď se mi dařilo hledat chybu bez debuggeru, tentokrát jsem ale zapomněl přiřadit explode jiné proměnné ( $idn = explode(",", $id); . Díky za pomoc.
|
||
Alphard Profil |
#4 · Zasláno: 22. 8. 2017, 23:06:18
Bylo by fajn zamyslet se nad tím kódem víc celkově.
Kdyby se ta idčka dávala do pole, tak by se pak snadno mohl vytvořit delete dotaz pomocí where id in (...) . Samozřejmě by tam šlo nacpat i to id ve string podobě, ale pole je elegantnější.
Když budeš před while a počítání $i preferovat foreach, vyhneš se častým chybám v přepočítání se :) $query = "SELECT * FROM comments WHERE 0"; foreach (explode(",",$articles) as $name) { // můžeš používat operátor .= $query .= " OR `Article url` = '".$name."'"; // toto by šlo také řešit lépe, minimálně escapovat, až bude v názvu článku apostrof, celé se to rozsype } $ids = []; // proměnné inicializuj správným typem $result = mysqli_query($connect,$query); while ($row = mysqli_fetch_array($result)){ $ids[] = $row[7]; // upravíš tabulku a kvůli * nebude sedět index, název sloupce by byl lepší } $query = "DELETE FROM comments WHERE id in (".implode(',', $ids).")"; mysqli_query($connect,$query); A teda všechno by to šlo napsat jedním SQL dotazem s poddotazem. |
||
Xanomes_ Profil * |
#5 · Zasláno: 23. 8. 2017, 06:46:24
Alphard:
Taky mě to napadlo, ale funguje to a nechce se mi přepisovat půlku kódu. Jinak v tvém kódu na řádku 5 mi přijde mnohem lepší escapovat před vstupem do databáze, než při vypisování dat.
|
||
Keeehi Profil |
#6 · Zasláno: 23. 8. 2017, 08:56:37
Xanomes:
„Jinak v tvém kódu na řádku 5 mi přijde mnohem lepší escapovat před vstupem do databáze, než při vypisování dat.“
Správné je escapovat jak při vkládání do databáze tak při výpisu dat. Ovšem v každém případě jinak a za jiným účelem. Při vkládání to bude pro $name funkce mysqli_real_escape_string() . Při výpisu to záleží na kontextu. Pokud budu předpokládat HTML, pak to bude htmlspecialchars($string, ENT_QUOTES) . Proč nepoužít htmlspecialchars už při ukládání do databáze? Protože html databázi nijak nevadí a escapování je potřeba dělat podle kontextu. Když by jsi dělal třeba export komentářů do CSV, tak by si je musel nejdříve "odescapovat" pro HTML a pak escapovat pro CSV. Navíc problém těchto transformací je, že občas nejsou zpátky převoditelné, takže je prostě dobré si držet uživatelův vstup v co nejčistší formě - tak jak ho zadal.
|
||
Časová prodleva: 7 let
|
0