PDO不会给出结果

时间:2013-02-15 18:32:54

标签: php mysql database pdo

所以,我今天已经从mysql_ *切换到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;

我尝试在Xampp上将此语句作为纯SQL执行。在那里工作。虽然在这里不起作用。我已经检查了所有参数即时传递,一切都是正确的。不知怎的,程序根本不会进入while循环。 ServerConnector只是通过PDO连接到数据库,并将PDO数据库对象返回到$ db。

由于

编辑:嗯,我正在使用最新的Xampp和PHP 5.4.7。 PDO默认情况下应启用。自己检查了php.ini文件,并在那里启用了

编辑:这是我的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;
    }

}

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

以下内容不需要在while循环中:

$row = $stmt->fetchAll()

这不需要在while循环中。它将整个记录集作为数组返回,因此您只能从该循环中获得一次迭代。

您可以将其更改为$stmt->fetch(PDO::FETCH_ASSOC)或不使用while循环,并迭代$row

答案 2 :(得分:1)

好吧,用print_r($ row)检查了我的数据库输出,发现我的二维数组在这里我的程序没有通过。意味着我在$ row [0] [KEY]上拥有所有信息,而不是$ row [key]。

修正:)

编辑:嗯,我也会发布我的代码。两小时前它完全一样,但它没有用。不要问我为什么 - .-'这样的工作:

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;
}

答案 3 :(得分:0)

您的问题缺乏关键性:错误消息

似乎以下是对PDO问题最需要的答案:

您的真实问题是缺少错误报告。所以

error_reporting(E_ALL);

通知所有PHP错误,例如拼写错误的常量

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
在您的服务器连接器中

以通知PDO错误

收到实际的错误消息后,您可以自行解决或在此处寻求帮助