Ошибка запроса вставки MySQL: неверный номер параметра: параметр не был определен

#php #mysql

#php #mysql

Вопрос:

я пытаюсь использовать запрос для вставки некоторых данных журнала в мою базу данных, которые мне понадобятся позже, когда кто-нибудь сменит свой пароль, но я не смог добавить запрос вставки я всегда получаю эту ошибку в заголовке вот мой код

 $oldpw = $_POST['oldpw'];
$newpwd = $_POST['newpwd'];
$newpwd2 = $_POST['newpwd2'];
$username = LoggedUser()['Username'];
$qvars = [':User'=>$username,':oldpw'=>md5($oldpw)];
$qvars[':pass'] = md5($newpwd);
    $insertuser = query("insert into SRO_VT_WEBSITE..TB_User (StrUserID,encrypted_password,old_password,new_password) values (:User,:oldpw,'$oldpw','$newpwd')", $qvars);
  

и это код файла conn и функции «query» внутри него

 function Open($host, $user, $pass, $acc, $shd, $log)
{
global $conn;
global $array;
global $_allowSecretCode;
global $_secretCodeColumn;

 $conn = new PDO("sqlsrv:server=$host;database=$acc", $user, $pass,[PDO::ATTR_TIMEOUT=>5]);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$array[] = $host;
$array[] = $user;
$array[] = $pass;
$array[] = $acc;
$array[] = $shd;
$array[] = $log;

if ($_allowSecretCode amp;amp; !ColExist($_secretCodeColumn, "TB_User", $array[3]))
    $_allowSecretCode = false;
}

/* Execute a Query */
function query($query, array $args)
{
try {
    global $conn;
    $q = $conn->prepare($query);
    $q->execute($args);
    //_log("db.log", "QueryExecuted: " . $query . "n"); logging
} catch (PDOException $e) {
    HandleException($e, $query);
} catch (Exception $e) {
    HandleException($e, $query);
}
return $q;
}
  

Комментарии:

1. Я действительно рекомендую вам сделать это с помощью триггера.

2. Неясно, как связаны два блока кода. Пожалуйста, пересмотрите. Кроме того, почему вы параметрируете некоторые значения, но не все (т.Е. :User,:oldpw,'$oldpw','$newpwd' )?

3. Password=:pass , phone = '$newpwd' where StrUserID=:User , и qvars содержит [':User'=>$username,':oldpw'=>md5($oldpw), ':pass'] => md5($newpwd)]; . Конечно, это не будет соответствовать.

4. Кроме того, ваш запрос вставки завершится ошибкой, потому что вы передаете 4 значения в 6 столбцов.

5. Вам нужно передать только то, что вам нужно. Если в вашем запросе есть 2 заполнителя, то в вашем массиве должны быть только эти 2 пары заполнителей. Если у вас есть 4 заполнителя, то только эти 4 пары. Кроме того, не стоит смешивать заполнители и подобные значения. Измените переменные старого / нового пароля на заполнители и передайте их также в массив.

Ответ №1:

Вам нужно привязать параметры вашего запроса здесь:

 $q = $conn->prepare($query);
    $q->execute($args);
  

https://www.php.net/manual/en/mysqli-stmt.bind-param.php
https://www.php.net/manual/en/pdostatement.bindparam.php

Комментарии:

1. я получил «неопределенные переменные аргументы», функция находится в другом файле, как я уже упоминал, я изменил запрос на $query = «вставить в SRO_VT_WEBSITE..TB_User (StrUserID,encrypted_password,old_password,new_password) значения (:User,:oldpw,’$oldpw’,’$newpwd’)»; $q = $conn-> подготовить ($query); $q-> выполнить ($ args);