Неверный номер параметра: количество связанных переменных не соответствует количеству токенов, использующих pdo

Эта проблема поставила меня в тупик, я просмотрел другие ответы на вопросы о переполнении стека, и ни один из них не ответил на мой вопрос.

**

Код:

**

    function inputVCA(){
global $dbh;
$count = 0;
if(isset($_POST['vca'])){
$pcid = mysql_real_escape_string($_POST['ID']);
$vca = $_POST['vca'];
$tok = strtok($vca, ";");
while($tok !== false){
$countNew = countDataToHour($count);
$stmt = $dbh->prepare("UPDATE $pcid SET $countNew = :token WHERE ID='1'");
$stmt -> bindParam(':token', $tok);
echo "<br>".$pcid."<br>";
echo countDataToHour($count)."<br>";
echo $tok."<br>";
if($stmt->execute()){
// do nothing
}else{
die("failed to execute query");
}
$count++;
$tok = strtok(";");
}
}
}

**

Вывод (включая сообщение об ошибке):

**

888
00:00
40

Предупреждение: PDOStatement :: execute (): SQLSTATE [HY093]: недопустимый номер параметра: число связанных переменных не соответствует количеству токенов в C: \ xampp \ htdocs \ practice \ src \ dataChecker.php в строке 170
не удалось выполнить запрос

**

Что я уже знаю о проблеме?

**

Причина, по которой я так озадачена этой проблемой, заключается в том, что когда я проверяю переменные и т. Д., Кажется, все выводится правильно Тем не мение:

  • Я проверил SQL-запрос без: переменных. Это работает
  • Выводимые переменные — это те, которые я ввел в форму, поэтому я предположил, что там не может быть проблем

**

Дополнительная информация

**

Одна часть моей программы, в которой я не уверен, это:

WHERE ID='1'

в моем запросе sql. Причина, по которой я это делаю, заключается в том, что на данный момент мне понадобится только одна строка в таблице sql.


Любая помощь приветствуется, спасибо :). Кроме того, как знаменатель, тот, кто проголосовал за меня, не должен иметь права голосовать за кого-либо. Я представил свою проблему очень четко. Мой php-код немного отрывочен, но если вы проголосуете за меня по этой причине, это непродуктивно и может отговорить новых пользователей размещать вопросы на этом сайте. Если новые пользователи не приходят, то вы будут проиграть другим конкурентам. Спасибо всем, кто внес полезный вклад.

-1

Решение

Во-первых, PDO и mysql_эти два API не смешиваются вместе.

Удалить mysql_real_escape_string,

Удалить цитаты вокруг этого $count = ':token' читать как $count = :token (заполнители не могут иметь кавычки вокруг них).

Вы должны будете поставить галочки вокруг вашего $pcid в ОБНОВЛЕНИИ, в сочетании с другими моими предложениями в моих комментариях и моим ответом здесь.

$pcid = $_POST['ID'];
...
$stmt = $dbh->prepare("UPDATE `$pcid` SET `$countNew` = :token WHERE ID='1'");
...

Это сообщение об ошибке согласно одному из ваших комментариев:

Версия сервера MySQL для правильного использования синтаксиса около ‘888 SET 00:00 =’: token ‘WHERE ID =’ 1 » в строке 1 ‘

Посмотрите, что говорит вам ошибка, near '888 и эти ошибки не остановятся на этом.

Имена таблиц не могу начать с числа или быть включительно состоит из чисел.

Согласно документации:

Идентификаторы могут начинаться с цифры, но если они не указаны, они могут состоять не только из цифр.

1

Другие решения

Заполнители могут представлять только ЦЕННОСТИ в запросе. Никогда не имя поля / таблицы или другое ключевое слово SQL.

UPDATE :pcid SET :count = ':token' WHERE ID='1'
^^^^^--field         ^^^^^^--value
^^^^^--field

Если вы хотите динамически вставлять имена таблиц / полей, вам придется использовать старые добрые методы, уязвимые для SQL-инъекций, такие как

$table = $source_of_pcid
$field = $source_of_count
$sql = "UPDATE $table SET $field = :token";
0

По вопросам рекламы [email protected]