Php PDO赢得';我不能给出结果

Php PDO赢得';我不能给出结果,php,mysql,database,pdo,Php,Mysql,Database,Pdo,所以,我今天从mysql切换到PDO,并试图让它运行,但不知怎么的,我没有得到任何结果 我的声明如下: $serverConnector = new ServerConnector(); $db = $serverConnector->connectToServer(); $stmt = $db->prepare("SELECT * FROM `" . TABLE_USERS . "` WHERE `" . USER_NICKNAME . "` =:user_nick

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

谢谢

编辑:嗯,我在PHP5.4.7中使用最新的Xampp。默认情况下应启用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;
    }

}

你不必在事先准备好的声明中引用:

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

基于上面所说的关于不需要在
execute()
中添加引号的内容:

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

$row = $stmt->fetchAll()
这不需要在一段时间内循环。它以数组的形式返回整个记录集,因此您只能从该循环中获得一次迭代


您可以将其更改为
$stmt->fetch(PDO::fetch_ASSOC)
,也可以不使用while循环,并在
$row

上迭代。您的问题缺少关键的东西:错误消息

似乎以下是对PDO问题最迫切的回答:

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

error_reporting(E_ALL);
收到所有PHP错误(如拼写错误的常量)的通知

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
在服务器连接器中,将收到PDO错误的通知


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

好的,用print\r($row)检查我的DB输出,发现我这里有一个二维数组,我的程序无法通过。表示我的所有信息都在$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;
}

SQL语句中不应该包含尾随分号。好的。认为这是“好风格”。这没用though@crush真正地我习惯于用分号来结束它们。PHP特别说明不要包含
。如果您在一个查询中包含多个语句,那么我认为这是可以的。它不会打乱你的查询-只是建议你不要包含它。顺便说一句,mysql字符集的拼写是
utf8
是的,试图解决我的问题,但没有成功:/谢谢你的建议anyhow@justbasti您确定设置了常量(表用户、用户ID等)和变量吗,有你想要的值吗?是的,所有东西都有我自己的设置文件,里面有所有这些常量,tripple也检查了它们。尽可能多地包含它们,这样我就不会错过任何地方,即使它毫无意义^^^^检查crush的答案,我忽略了那个答案,并更改了我的答案谢谢,已经这么做了。我只想将ServerConnector类编辑到我的帖子中,我还想添加一个,如果列名与对象的属性相同,则可以使用它直接获取对象
$this
表示的任何对象。不过,它将返回该类的一个新实例。亲爱的,我会在修复此错误后立即尝试:)谢谢
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;
}