Autor Zpráva
Xanomes_
Profil *
$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
(v uvedeném kódu řádek č. 14), přitom $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 *
$id = explode(",",$id);
V prvním průchodu toho cyklu uděláš z $id pole.

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 *
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
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 *
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
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.

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:

0