Недопустимый номер параметра: параметры не были связаны

У меня есть статическое приложение чата, использующее php и mysql, вот код для отображения сообщений в окне чата

$sql="SELECT id,msg,time,msg.from,msg.to from msg WHERE (msg.from='".$_SESSION["username"]."' OR msg.from='".$_SESSION["tousermessage"]."') AND (msg.to='".$_SESSION["tousermessage"]."' OR msg.to='".$_SESSION["username"]."') ORDER BY time"; $ex=$conn->prepare($sql); $ex->execute(); echo "<div class='text-wrap'>"; while($result=$ex->fetch(PDO::FETCH_ASSOC)) { if ($result['from']==$_SESSION["username"]) { echo "<div class='message-view' >"; echo "<b class='name'>".$_SESSION["username"]."</b></br>"; echo "<p class='subject'>".$result["msg"]."</p><p class='time'>".$result["time"]."</p>"; echo "</div>"; } else { echo "<div class='message-view' style='background-color: rgb(216, 236, 244);'>"; echo "<b class='name'>".$_SESSION["tousermessage"]."</b><br>"; echo "<p class='subject'>".$result["msg"]."</p><p class='time'>".$result["time"]."</p>"; echo "</div>"; } if($result['to']==$_SESSION['username']) { $sqlupdate="UPDATE msg SET readmsg=1 WHERE id=".$result['id']." and msg='".$result["msg"]."'"; $ex1=$conn->prepare($sqlupdate); $ex1->execute(); } } echo "</div>"; 

Иногда это показывает исключение:

SQLSTATE [HY093]: Недопустимый номер параметра: параметры не были связаны.

Сообщение вставляется в таблицу msg, но ошибка возникает при отображении сообщения. Ошибка происходит случайным образом со стороны отправителя или приемника или с обеих сторон. Я не могу найти шаблон или причину его возникновения!

Вы не используете bind_param в соответствии с подготовленной парадигмой заявления.

В вашем выборе:

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

И в вашем обновлении:

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

Вышеприведенное позволяет вашему подготовленному оператору принимать параметры в параметризованном строчном формате (используя «?» Для представления параметра) и принимать параметры с информацией о типе с помощью метода bind_param ().

Это позволяет механизму БД правильно отображать и удалять параметры перед выполнением запроса.

Нет смысла использовать подготовленные операторы, если вы не являетесь обязательными параметрами, что, вероятно, связано с тем, что вы получаете это предупреждение.

На стороне примечание, объединение запросов (как вы делаете выше) является очень плохой привычкой – это открывает вам до SQL Injection


Дополнительную информацию о подготовленных операциях см. В документах:

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