2013-09-01 2 views
0

Я буквально потратил часы на поиск в Google и поиск, и я понятия не имею, что я делаю неправильно. Я использую POST, и я сам пробовал запрос в phpMyAdmin, и он работал, но он не работает в PDO, и я не знаю, почему. Он работал, когда я использовал mysql_query, а что нет, но я хочу защитить себя от SQL-инъекции.Подготовленный запрос PDO возвращает 0 затронутых строк

Вот код, я использую:

<?php 
    if(isset($_POST['user']) and isset($_POST['pass'])) { 
     $name = $_POST['user']; 
     $pass = $_POST['pass']; 

     $db = new PDO('mysql:host=localhost;dbname=*****;charset=utf8', '*****', '*****'); 
     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $query = $db->prepare("SELECT * FROM stored WHERE _User LIKE :username AND _Pass LIKE :password"); 
     $query->bindValue(":username", $user, PDO::PARAM_STR); 
     $query->bindValue(":password", $pass, PDO::PARAM_STR); 

     $query->execute(); 

     echo $query->rowCount(); 
    } 
?> 
+0

'Для большинства баз данных PDOStatement :: rowCount() не возвращает количество строк, на которые влияет инструкция SELECT. Вместо этого используйте PDO :: query() для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, а затем используйте PDOStatement :: fetchColumn(), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие. 'Http://php.net/manual/en/pdostatement.rowcount.php –

+0

Скопируйте код. Помогите людям помочь вам :) – Fluffeh

+0

Помимо всего прочего вопросы, ** где на Земле вы получили эту идею использования LIKE для сравнения строк? ** –

ответ

0

Либо вы используете древнюю версию PHP, или нет строки в базе данных, соответствующих критериям. Обновите для первого и проверьте свои данные и запрос на второй.

Кроме того, как сказал нам Священный Линус, «Talk Is Cheap, Show Me The Code».
Не говорите нам: «Это сработало, когда я использовал запрос бла-бла». Запустите его. В том же файле, рядом с этим кодом. Таким образом, вы получите доказательство . Только такое доказательство имеет значение, в то время как ваши спекуляции - нет.

Однако, строго говоря, не нужна эта функция вообще, а также большая часть кода

$stmt = $db->prepare("SELECT 1 FROM stored WHERE _User = ? AND _Pass = ?"); 
$stmt->execute(array($_POST['user'],$_POST['pass'])); 
echo $stmt->fetchColumn(); 

достаточно.

+0

Как мне обновить? Как связаться с моим веб-хостом? Я уже протестировал запрос и работал в phpMyAdmin. http://i.imgur.com/iUqUrMW.png –

+0

перед обновлением вам нужно знать, есть ли проблемы. ВСЕ ваши действия основаны на простых предположениях. Почему бы вам не понять проблему и только потом начать решение? –

+0

В любом случае, это оказалось глупой опечаткой, вызванной отсутствием сообщений об ошибках –

1

Похоже, вы называете переменную имени пользователя $ name в строке 41, но когда вы привязываете параметр в строке 46, вы называете ее $ user.

+0

Ну, я отставлен. Вот и все, вы гений. Думаю, я должен уделять больше внимания сохранению последовательности. Большое спасибо за то, что я закончил многочасовое занятие поисками чего-то, что было моей ошибкой. Наконец-то я могу заснуть. Еще раз спасибо. –

+0

@TidasBay простой 'error_reporting (E_ALL);' может спасти вас все эти часы. –

+0

Я также рассмотрю это. Благодаря! –

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