Этот запрос отлично работает на Sequel Pro:
SELECT t1.* FROM `erapido_messages` t1
LEFT OUTER JOIN `erapido_messages` t2 ON `t1.sender_id` = `t2.sender_id`
AND (`t1.msg_date` < `t2.msg_date` OR `t1.msg_date` = `t2.msg_date` AND `t1.sender_id` != `t2.sender_id`)
WHERE `t2.sender_id` IS NULL AND `t1.sender_id`!= `0` AND `t1.receiver_id`= 28
ORDER BY `t1.msg_date` DESC;
Когда я использую его в своем PHP-скрипте, он возвращает ошибку. Это полный запрос в php:
$query = "SELECT t1.* FROM `erapido_messages` t1
LEFT OUTER JOIN `erapido_messages` t2 ON `t1.sender_id` = `t2.sender_id`
AND (`t1.msg_date` < `t2.msg_date` OR `t1.msg_date` = `t2.msg_date` AND `t1.sender_id` != `t2.sender_id`)
WHERE `t2.sender_id` IS NULL AND `t1.sender_id`!= `0` AND `t1.receiver_id`= ?
ORDER BY `t1.msg_date` DESC";
//$sql is my connection and it works fine on other queries
$statement = $sql->prepare($query);
//bind parameters for markers: s = string, i = integer, d = double, b = blob
$statement->bind_param('i', $receiver_id);//$receiver_id is defined
//execute query
$statement->execute();
//store the results; allows to count the rows
$statement->store_result();
//bind result variables
$statement->bind_result($id, $receiver_name, $receiver_img, $receiver_email, $sender_id, $sender_name, $sender_email, $sender_img, $subject, $message, $msg_date);
Это ошибка:
Fatal error: Call to a member function bind_param() on boolean in /messages.php on line 53
Я понимаю, что этот оператор может вернуть ‘false’ в случае сбоя запроса:
$statement = $sql->prepare($query);
Тем не менее, я не вижу, что не так в запросе. Любая помощь приветствуется!
Большое спасибо.
Ваш оператор prepare возвращает false из-за неверной строки запроса. Измените ваш запрос, как показано ниже. В настоящее время вы экранируете имена столбцов, потому что они имеют обратную галочку, что приводит к ошибке при ее подготовке.
$query = "select * from `dbname` table where `table`.column= ?
ORDER BY `table`.column DESC LIMIT 2 ";
Это должно исправить эту ошибку.
Других решений пока нет …