«Предупреждение: PDO :: prepare () ожидает, что параметр 2 будет массивом, задана строка» - когда был указан только один аргумент - PullRequest
2 голосов
/ 11 мая 2011

Я не очень разбираюсь в запросах PDO и MySQL ..

Посмотрите на эту функцию:

function add($mynick, $friend) {
   $dbh = new PDO(DSN,USERNAME,PASSWORD);
   $sth = $dbh->prepare('UPDATE pinfo SET friends=concat_ws(',' , friends, $friend)  WHERE nick = :mynick');
   $sth->bindParam(':mynick', $mynick);
   //$sth->bindParam(':friend', $friend);
   $sth->execute(); 
}

Эта функция не работает:

Warning: PDO::prepare() expects parameter 2 to be array, string given in /test5.php 
Fatal error: Call to a member function bindParam() on a non-object in /test5.php

Я также пытался ослепить $fliend var, в concat_ws, или удалив все $var и bindParam; Соединение с БД и таблица БД в порядке.

Почему это неправильно?

Если я попытаюсь использовать PDO с простым UPDATE запросом, без concat_ws это сработает.

Ответы [ 2 ]

3 голосов
/ 11 мая 2011
$sth = $dbh->prepare('
     UPDATE pinfo 
        SET friends=concat_ws(',' , friends, $friend) 
      WHERE nick = :mynick
');

Я переформатировал ваш запрос, чтобы, надеюсь, ошибка стала более очевидной.

Не видите?

Проверьте подсветку синтаксиса, предоставляемую SO. Видите, как запятая в SET черная?

Проблема в том, что вы заключаете свой оператор SQL в одинарные кавычки, но хотите использовать внутри запроса одинарные кавычки. Что действительно происходит, так это то, что вы отбрасываете аргумент в кавычках, передаете PHP запятую, затем снова открываете кавычку, в результате чего два аргумента передаются prepare: 'UPDATE pinfo SET friends=concat_ws(', а затем ' , friends, $friend) WHERE nick = :mynick'. Вот почему PHP жалуется на недопустимость второго аргумента. Вам нужно либо избежать одинарных кавычек, либо использовать двойные кавычки для переноса запроса.

Поэтому вам необходимо:

  1. Используйте здесь двойные кавычки, чтобы избежать побега (обратная косая черта может быть ужасно уродливой), и
  2. Привязывайте $friend правильно, а не позволяйте PHP интерполировать его, как отметил @Ian Wood, и, как изначально предлагал ваш закомментированный код

Таким образом:

$sth = $dbh->prepare("UPDATE pinfo SET friends=concat_ws(',' , friends, :friend)  WHERE nick = :mynick");
$sth->bindParam(':mynick', $mynick);
$sth->bindParam(':friend', $friend);
$sth->execute(); 
0 голосов
/ 11 мая 2011
concat_ws(',' , friends, $friend)

думаю, что должно быть

concat_ws(',' , friends, :friend)

Однако я бы подумал об изменении вашей архитектуры.

Просто имейте таблицу людей, а затем таблицу друзей ... Сохраняйте данные о людях в таблице людей и в таблице друзей, в двух столбцах «person_id» и «friend_id» просто храните идентификаторы связанных людей - в итоге вы получите гораздо больше полезных и управляемых данных.

как много людей могут иметь много друзей, вам нужны отношения "многие ко многим" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...