2013-10-25 2 views
0

У меня была проблема в последние несколько дней, когда я сузил проблему, как показано ниже. Прохождение параметров отлично работает, если я не использую его с пользовательской функцией расстояния. Может ли кто-нибудь сказать мне, что я делаю неправильно? На данный момент я просто обрабатываю поле вручную и жестко кодирую его в запрос.Передача дезинфицированного ввода с функцией не работает

WORKS (возвращает правильные результаты):

$sth = $db->prepare("SELECT * FROM providers WHERE distance('42.8','-73.9',lat,lon)<25"); 
$sth->execute(); 

не работает (возвращает все поставщики):

$sth = $db->prepare("SELECT * FROM providers WHERE distance('42.8','-73.9',lat,lon)<:radius"); 
$sth->execute(array(":radius" =>25)); 

ответ

2

Я не очень хорошо знаком с PDO, но возможно это потому, что вы передают int, и оператор обрабатывает значения как string по умолчанию. См. Страницу руководства: http://php.net/manual/en/pdostatement.execute.php и посмотрите ниже: input_parameters. Вы всегда можете попробовать использовать bind_param(), чтобы получить данные в правильном типе перед выполнением вашего заявления.

+0

. Считаете ли вы, что это так? (Я должен был подумать добавить это как тег). SQLite имеет свободную систему типов данных. –

+0

Хммм, я не уверен (не знаком с SQLite), но если бы я сделал предположение, возможно, тип данных имеет значение, потому что вы используете подготовленный оператор. Я бы предположил, что он имеет меньше общего с системой данных типа SQLite и больше связан с PDO, требующим более подробной информации о данных, с которыми он работает. – Crackertastic

+0

Хорошо ... Я собираюсь быть АФК на некоторое время ... но я попробую bind_param() позже сегодня вечером и отчитаюсь. –

0

попробовать этот код: Я немного новичок в PDO себя, но Я нашел, что это сработало для меня:

$radius = 25; 
$sth = $db->prepare("SELECT * FROM providers WHERE distance('42.8','-73.9',lat,lon)<:radius"); 
$query_params = array( 
     ':radius' => $radius 
    ); 
$sth = $db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); // forgot 

$sth -> execute($query_params); 
+0

Вы практически ничего не изменили. прямо передавая массив v.s. создавая массив var, а затем передавая, что var в основном такой же, как и функция '-> execute()'. –

+0

Извините, вы правы. Я забыл // забытую строку. Я предполагаю, что это что-то делает для PDO. – bigbitecode

Смежные вопросы