Когда я делаю (в laravel):
<?php \DB::select('SELECT * FROM my_table WHERE id = :id || id = :id', [ 'id' => 1, ]);
В нем говорится:
SQLSTATE [HY093]: недопустимый номер параметра (SQL: SELECT * FROM my_table WHERE id =: id || id =: id)
Но когда я делаю (в чистом php):
<?php $dbh = new PDO('mysql:dbname=...', '...', '...'); $stmt = $dbh->prepare('SELECT * FROM my_table WHERE id = :id || id = :id'); $r = $stmt->execute([ 'id' => 1, ]); while ($row = $stmt->fetch()) { var_dump($row['id']); }
Это удается. Что я делаю не так?
PS По-видимому, запрос, который я выполнял, когда я столкнулся с проблемой, был более значимым.
UPD Более-менее реальный запрос:
SELECT id FROM objects WHERE ACOS( SIN(RADIANS(lat)) * SIN(RADIANS(:lat)) + COS(RADIANS(lat)) * COS(RADIANS(:lat)) * COS(RADIANS(:lng - lng)) ) * 6371 < 10
Из того, что я вижу, все сводится к тому, что mysql
не может иметь дело с именованными параметрами.
mysqli::prepare
:
Этот параметр может включать один или несколько маркеров параметров в выражении SQL, вставляя знаки вопросительного знака (?) В соответствующие позиции.
pdo::prepare
:
Вы должны включить уникальный маркер параметра для каждого значения, которое вы хотите передать в оператор, когда вы вызываете PDOStatement :: execute (). Вы не можете использовать один и тот же параметр маркера одного и того же имени более одного раза в подготовленном операторе, если не включен режим эмуляции.
По умолчанию у Laravel отключен режим эмуляции. Его можно включить в config/database.php
, добавив в настройки подключения параметры 'options' => [PDO::ATTR_EMULATE_PREPARES => TRUE]
. Таким образом, вы получите тот же результат, что и в чистом php. Не уверен, что это хорошая идея.