0

所以,我今天从 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

4 回答 4

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;
于 2013-02-15T18:34:25.690 回答
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.

于 2013-02-15T18:43:23.243 回答
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;
}
于 2013-02-15T22:29:23.980 回答
0

您的问题缺少关键的东西:错误消息

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

真正的问题是缺乏错误报告。所以

error_reporting(E_ALL);

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

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

在您的服务器连接器中收到 PDO 错误通知

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

于 2013-02-15T18:47:38.597 回答