sql >> Databasteknik >  >> RDS >> Mysql

Ogiltigt parameternummer:inga parametrar var bundna

Du använder inte bind_param, enligt det förberedda satsparadigmet.

I ditt val:

$sql = "SELECT id,msg,time,msg.from,msg.to 
        FROM msg 
        WHERE msg.from IN (?, ?) 
            AND msg.to IN (?, ?)
        ORDER BY time";

$ex = $conn->prepare($sql);
$ex->bind_param("s", $_SESSION["username"]);
$ex->bind_param("s", $_SESSION["tousermessage"]);
$ex->bind_param("s", $_SESSION["username"]);
$ex->bind_param("s", $_SESSION["tousermessage"]);
$ex->execute();

Och i din uppdatering:

$sql = "UPDATE msg 
        SET readmsg=1 
        WHERE id = ? 
            AND msg = ?";

$ex1 = $conn->prepare($sql);
$ex1->bind_param("i", $result['id']);
$ex1->bind_param("s", $result["msg"]);
$ex1->execute();

Ovanstående tillåter din förberedda sats att acceptera parametrar i det parametriserade strängformatet (med "?" för att representera en param) och att acceptera params med typinformation, via bind_param()-metoden.

Detta gör det möjligt för DB-motorn att korrekt casta och escape params innan du kör din fråga.

Det är ingen idé att använda förberedda uttalanden om du inte binder parametrar, vilket förmodligen är anledningen till att du får den varningen.

Som en sidoanteckning är sammanlänkning av frågor (som du gör ovan) en mycket dålig vana - det öppnar dig för SQL-injektion

Se dokumenten för mer information om förberedda uttalanden:

http://php.net/manual/en/mysqli-stmt.prepare .php




  1. Det går inte att ta bort databasen

  2. Doktrinen består inte entitet med booleska värden och PDO::ATTR_EMULATE_PREPARES =false i Mysql

  3. Det bästa sättet att ta bort värde från SET-fältet?

  4. Viktiga hälsokontroller för dina MySQL Source-Replica Servers