所以,我今天已经从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;
}
}
答案 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错误
收到实际的错误消息后,您可以自行解决或在此处寻求帮助