PDO не может выполнить извинение после первой попытки, аргументы не будут добавлены в подготовленный оператор в подпрограмме?

Enviro: MySQL, PHP 5.5

У меня есть ситуация, когда мне нужно вернуть случайный результат из базы данных. Я попробовал два способа сделать это. Тот, который возвращает массив результатов, и я случайно выбираю один, используя array_rand($results) а другой добавляет order by rand() limit1;

Когда я возвращал список результатов, время выполнения записывалось с консоли MySQL следующим образом:

602 rows in set (0.05 sec)
Query OK, 0 rows affected (49.37 sec)

Это не хорошо. Поэтому я выбираю другой метод, который сообщил:

1 row in set (0.05 sec)
Query OK, 0 rows affected (0.36 sec)

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

Вот моя рутина:

CREATE PROCEDURE `getRandomRecord`(
IN _args varchar(100)
)
BEGIN
SET @query = CONCAT('SELECT C.*, B.*
FROM C
LEFT JOIN B
ON B.id = c.Bid
where (C.Type=27 || C.Type=28 || C.Type=29)
and C.EndDate>CURRENT_TIMESTAMP() ',_args,' order by rand() limit 1;');

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//

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

Арги записываются так:

$args= !empty($args) ? $args : '';
//args is empty first time
$dbHandler = new RandomRecordDatabase();
$results = $dbHandler->getRandomRecord($args);
//Do Stuff HERE
$args .= ' AND C.id!='.$results['C.id'];
$dealer_results = $dbHandler->getRandomRecord($args);

Функция выглядит так:

public function getRandomRecord($args){
try
{
$procedure = "Call getRandomRecord(?)";
$statement = $this -> _dbh -> prepare($procedure);
$statement -> bindParam(1, $args);
$statement -> execute();
$results = $statement -> fetchAll(PDO::FETCH_ASSOC);
return $results[0];
}
catch(PDOException $e)
{
echo $e -> getMessage();
}
}

При втором вызове этого метода я получаю следующее исключение PDOException:

Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"387 order by rand() limit 1'

Который ссылается на строку $statement -> execute();

Как я могу исправить эту ошибку? Спасибо!

ОБНОВЛЕНИЕ (РАСТВОР):

Я должен рассмотреть вывод args более внимательно, и я бы увидел ошибку: echo $args;

В одном случае я отметил смешанный случай: «И C.id = 123 И AND C.id = 456 и C.id =» 111 »И C.id = 789.

Я изменил один случай, который я никогда не заметил, расположенный в другом сценарии. Это теперь решает проблему.

0

Решение

Вам не хватает второй кавычки после вашей переменной, именно об этом говорится в сообщении об ошибке. Кавычки вокруг целых чисел не требуются и не рекомендуются в sql.

Я не вижу, где вы вводите эту ошибочную цитату, так как вы не разместили весь соответствующий код.

1

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

Других решений пока нет …

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