2013-02-15 3 views
0

Итак, я перешел с mysql_ * на PDO сегодня и пытаюсь запустить его, но как-то получаю нулевые результаты.PDO не даст результатов

моего заявление выглядит следующим образом:

$serverConnector = new ServerConnector(); 
    $db = $serverConnector->connectToServer(); 
    $stmt = $db->prepare("SELECT * FROM `" . TABLE_USERS . "` WHERE `" . USER_NICKNAME . "` =:user_nickname OR `" . USER_EMAIL . "` =:user_email;"); 
    $stmt->execute(array(':user_nickname' => "'".$name_or_email."'", ':user_email' => "'".$name_or_email."'")); 
    while ($row = $stmt->fetchAll(PDO::FETCH_ASSOC)) { 
     $this->id = $row[USER_ID]; 
     $this->joined = $row[USER_JOINED]; 
     ... 
    } 
    $db = null; 

Я попытался выполнение этого заявления как чистый SQL на Xampp. Работал там. Однако здесь не работает. Я трипл проверил все параметры im, проходящие, и все правильно. Как-то программа вообще не войдет в цикл while. ServerConnector просто подключается к базе данных через PDO и возвращает объект базы данных PDO в $ db.

Благодаря

EDIT: Ну, я использую новейшую Xampp с PHP 5.4.7. PDO Должен быть включен по умолчанию. Проверял файл php.ini сам, и он также был включен там

EDIT: Вот мой класс ServerConnector. Включена ошибка. Хотя я не буду получать любые:/

class ServerConnector { 

    public function connectToServer(){ 
     $db = new PDO('mysql:host=' . DATABASE_HOST . ';dbname=' . DATABASE_NAME . ';charset=UTF-8', 
         DATABASE_USERNAME, 
         DATABASE_PASSWORD, 
         array(PDO::ATTR_EMULATE_PREPARES => false, 
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
     return $db; 
    } 

} 
+1

Вы не должны включать конечную полуточку в ваш оператор SQL. – crush

+0

Хорошо. думал, что это «хороший стиль». Не делает трюк, хотя – JustBasti

+0

@crush, правда? У меня есть привычка всегда заканчивать их с помощью двоеточия. – ficuscr

ответ

1

Хорошо, проверил вывод моей базы данных с помощью print_r ($ row) и узнал, что у меня есть двумерный массив здесь, что моя программа не проходит. Значит, у меня есть вся моя информация о $ row [0] [KEY], а не о $ row [key].

Fixed :)

EDIT: Ну, я также разместить свой код. Если бы это было точно так же, как два часа назад, но это не сработало. Не спрашивайте меня, почему -.- «Работает вот так:

function receiveUserData($name_or_email) { 

    $serverConnector = new ServerConnector(); 
    $db = $serverConnector->connectToServer(); 
    $stmt = $db->prepare("SELECT * FROM `" . TABLE_USERS . "` WHERE `" . USER_NICKNAME . "` =:user_nickname OR `" . USER_EMAIL . "` =:user_email"); 
    $stmt->execute(array(':user_nickname' => $name_or_email, ':user_email' => $name_or_email)); 

    $row = $stmt->fetch(PDO::FETCH_ASSOC); 

    $this->user_id = $row[USER_ID]; 
    $this->user_joined = $row[USER_JOINED]; 
    $this->user_last_seen = $row[USER_LAST_SEEN]; 
    $this->user_salt = $row[USER_SALT]; 
    $this->user_nickname = $row[USER_NICKNAME]; 
    $this->user_name = $row[USER_NAME]; 
    $this->user_last_name = $row[USER_LAST_NAME]; 
    $this->user_email = $row[USER_EMAIL]; 
    $this->user_password = $row[USER_PASSWORD]; 
    $this->user_save_password = $row[USER_SAVE_PASSWORD]; 

    $db = null; 
} 
4

Вы не должны процитировать с подготовленным заявлением:

$serverConnector = new ServerConnector(); 
    $db = $serverConnector->connectToServer(); 
    $stmt = $db->prepare("SELECT * FROM `" . TABLE_USERS . "` WHERE `" . USER_NICKNAME . "` =:user_nickname OR `" . USER_EMAIL . "` =:user_email;"); 
    $stmt->execute(array(':user_nickname' => $name_or_email, ':user_email' => $name_or_email)); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     $this->id = $row[USER_ID]; 
     $this->joined = $row[USER_JOINED]; 
     ... 
    } 
    $db = null; 
+0

Да, была попытка исправить мою проблему, но это не сработало:/Спасибо за совет в любом случае – JustBasti

+0

@justbasti Вы уверены, что константы (TABLE_USERS, USER_ID и т. д.) и переменные установлены и имеют значение, которое вы хотите? –

+0

Да, все:/Получил мой собственный файл настроек со всеми этими константами внутри и трипл, также проверил их. Вложил их как можно чаще, поэтому я не пропустил бы его нигде, даже если его бессмысленный ^^ – JustBasti

2

Опираясь на то, что было сказано выше о необходимости не добавлять цитаты в execute():

$serverConnector = new ServerConnector(); 
$db = $serverConnector->connectToServer(); 
$stmt = $db->prepare("SELECT * FROM `" . TABLE_USERS . "` WHERE `" . USER_NICKNAME . "` =:user_nickname OR `" . USER_EMAIL . "` =:user_email;"); 
$stmt->execute(array(':user_nickname' => $name_or_email, ':user_email' => $name_or_email)); 
while ($row = $stmt->fetchAll(PDO::FETCH_ASSOC)) { 
    $this->id = $row[USER_ID]; 
    $this->joined = $row[USER_JOINED]; 
    ... 
} 
$db = null; 

следующие не нужно быть в цикле в то время:

$row = $stmt->fetchAll() 

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

Вы можете либо изменить это на $stmt->fetch(PDO::FETCH_ASSOC), либо не использовать цикл while и перебрать $row.

+0

Я также хотел добавить, что вы можете использовать [PDOStatement: : fetchObject()] (http://php.net/manual/en/pdostatement.fetchobject.php), чтобы получить непосредственно в любой объект '$ this', если имена столбцов совпадают с свойствами вашего объекта. Однако он вернет новый экземпляр этого класса. – crush

+0

Сладкий, я попробую, как только я исправил эту ошибку :) Спасибо – JustBasti

0

Ваш вопрос не имеет критическую вещи: сообщение об ошибке

кажется, что следующее наиболее востребованный ответ на PDO вопросы:

Вашей реальной проблема является отсутствием сообщений об ошибках. Так

error_reporting(E_ALL); 

получать уведомления о всех ошибках PHP как с орфографической ошибкой констант

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

разъем вашего сервера, чтобы получать уведомления ошибок PDO

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

+0

Еще хороший совет – crush

+0

Спасибо, уже сделано. Я просто отредактирую класс ServerConnector на свой пост – JustBasti

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