Mysql
 sql >> Database >  >> RDS >> Mysql

Numero parametro non valido:nessun parametro è stato associato

Non stai usando bind_param, secondo il paradigma dell'istruzione preparata.

Nella tua selezione:

$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();

E nel tuo aggiornamento:

$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();

Quanto sopra consente all'istruzione preparata di accettare parametri nel formato stringa parametrizzato (usando "?" per rappresentare un parametro) e di accettare parametri con informazioni sul tipo, tramite il metodo bind_param().

Ciò consente al motore DB di eseguire correttamente il cast e l'escape dei parametri prima di eseguire la query.

Non ha senso usare le istruzioni preparate se non stai vincolando i parametri, motivo per cui probabilmente stai ricevendo quell'avviso.

Una nota a margine, la concatenazione delle query (come stai facendo sopra) è una pessima abitudine:ti apre a Iniezione SQL

Vedere i documenti per ulteriori informazioni sulle dichiarazioni preparate:

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