3

ここに私の現在のコードがあります

function getUserDetails($username=NULL, $id=NULL) {
    if($username!=NULL) {
        $column = "user_name";
        $data = $username;
    }
    elseif($id!=NULL) {
        $column = "id";
        $data = $id;
    }

    global $db;

    $query = $db->prepare("SELECT id, username, permissions, forename, surname, password, email, courseid, choiceid, lastlogin, active FROM users WHERE $column = :column");
    $query->bindParam(":column", $data);
    $query->execute();
    $query->bind_result ($id, $username, $permissions, $forename, $surname, $password, $email, $courseid, $choiceid, $lastlogin, $active);
    while ($query->fetch()){
        $row = array('id' => $id, 'userlevel' => $permissions, 'username' => $username, 'forename' => $forename, 'surname' => $surname, 'password' => $password, 'email' => $email, 'courseId' => $courseid, 'choiceId' => $choiceId, 'lastlogin' => $lastlogin, 'active'=> $active);
    }
    return ($row);
}

bind_result が pdo で機能しないことがわかったので、これを pdo に変換しようとしています。

フェッチを使用する必要があることを読みましたか?しかし、私は本当に混乱しています。

[編集]

私はこれを試しました:

function getUserDetails($username=NULL,$id=NULL) {
    if($username!=NULL) {
        $column = "user_name";
        $data = $username;
    }
    elseif($id!=NULL) {
        $column = "id";
        $data = $id;
    }

    global $db;

    $query = $db->prepare("SELECT id, username, permissions, forename, surname, password, email, courseid, choiceid, lastlogin, active FROM users WHERE $column = :column");
    $query->bindParam(":column", $data);
    $query->execute();

    $results = array();
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
        $results[] = $row;
    }

    return ($results);
}

これは正しい方向への一歩ですか?

[編集2]

私のコードをこれに更新しました:

function getUserDetails($username) {
    global $db;

    $query = $db->prepare("SELECT * FROM users WHERE username = :username");
    $query->bindParam(":username", $username);
    return $query->fetch(PDO::FETCH_ASSOC);
}

$username = 'uname';
$result = getUserDetails($username);
print_r($result);

ただし、何も出力しません。ユーザー名は確実に存在します。


いくつかのダミーデータを使用してテストデータベースを試しました

$data = '2';
$sth = $db->prepare("SELECT * FROM test WHERE id = :id");
$sth->bindParam(":id", $data);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);   

印刷された配列にあるものにどのようにアクセスするかを理解しようとしています:配列は次のようになります

Array ( [Id] => 2 [Name] => tom ) 

私は(例えば)どのようにしますか

$name = $result['name'];    //line 67

そのコードを試すと、

Notice: Undefined index: name in <directory>\test.php on line 67

理解した!

function getUserDetails($username) {
    global $db;

    $sth = $db->prepare("SELECT id, username, permissions, forename, surname, password, email, courseid, choiceid, lastlogin, active FROM users WHERE username = :username");
    $sth->bindParam(":username", $username);
    $sth->execute();
    $result = $sth->fetch(PDO::FETCH_ASSOC);

    return $result;
}


$username = 'un';
$userdetails = getUserDetails($username);
echo $userdetails['forename'];

そしてそれは私に正しい答えを与えます!ご協力いただきありがとうございます

4

1 に答える 1

3

はい!
正しい方向への大きな一歩です。
ご覧のとおり、mysqli は、プレースホルダーのバインド結果の返しの両方で、準備済みステートメントではまったく使用できません。
一方、PDO は劇的に少ないコードで問題を解決できます。
PDO との無駄なバインドはまったく必要ありません。fetchAll() ですべての結果を取得するだけです。

function getUserDetails($username=NULL,$id=NULL) {
    if ($username) {
        $column = "user_name";
        $data = $username;
    } elseif($id) {
        $column = "id";
        $data = $id;
    } else {
        return;
    }
    global $db;

    $query = $db->prepare("SELECT * FROM users WHERE $column = ?");
    $query->execute(array($data));
    return $query->fetchAll();
}

ちょっと待って。ユーザーの詳細である場合、なぜ配列を返したいのですか? 返された配列に無駄な次元が追加されます。このまさにその場合のためにそれを作る

    return $query->fetch();

fetchAll() の代わりに。
ただし、多くの行が必要な場合は、後者の方法を使用してください。
他の方法と便利な接続オプションについては、タグ wikiを参照してください。

于 2013-03-04T05:14:25.000 に答える