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に返すだけです。

ありがとう

編集:まあ、私は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;
    }

}
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ループである必要はありません。レコードセット全体を配列として返すため、そのループから1回だけ反復を取得します。

$stmt->fetch(PDO::FETCH_ASSOC)これをwhileループに変更するか、使用しないように変更して、を繰り返すことができます$row

于 2013-02-15T18:43:23.243 に答える
1

了解しました。print_r($ row)を使用してDB出力を確認したところ、プログラムが通過しない2次元配列がここにあることがわかりました。$row[key]ではなく$row[0][KEY]にすべての情報があることを意味します。

修理済み :)

編集:まあ、私も私のコードを投稿します。2時間前とまったく同じ方法でしたが、機能しませんでした。理由を聞かないでください-.-'このように動作します:

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 に答える