0

mySQLibind_paramsやその他の関連メソッドで少し迷っています。これまで、クラス構造を使用してログインスクリプトを作成しました。

$qu = $this->DBH->prepare("SELECT * FROM CVUSERS WHERE username = ? AND password = ?");
$qu->bind_params('ss',$username,$password);

今、これは私が迷子になっているところです。ログインスクリプトとして、クエリの結果が1つだけであることを確認したいと思います。クエリ文字列からintまたはbooleanを返すにはどうすればよいですか?

bind_result($result);
if($result === 1){
    //this identical statement doesn't work :S
    //using an equals statements works for every entry. Even invalid ones.
    //I've found $result will always equal 1, there is more than one row in my table
}
4

4 に答える 4

2

プリペアドステートメントに対するMysqliのサポートは非​​常に醜いです。したがって、簡単な方法で情報を取得することはできません。
何らかの理由で、呼び出すには常に奇妙な関数が必要です。それがあなたの疑問の源です。
bind_result()は文字通り何もしません。fetch()を呼び出した後にのみ機能を開始します。したがって、コードに表示されます。

もう1つの方法は、最初に行ったようにcount()ではなくデータ自体を選択し、返された行数を確認することです。しかし、それでも別の関数呼び出しが必要です

$qu->execute();
$qu->store_result();
if($qu->num_rows){
    $this->_constructSessions($username);
}

しかし、もし私があなたなら、多かれ少なかれこのようにします

$qu = $this->DBH->prepare("SELECT COUNT(*) FROM CVUSERS WHERE username= ? AND password = ? ");
$qu->bind_param('ss',$username,$password);
$qu->execute();
$res = $stmt->get_result();
$row = $res->fetch_array();
if($row){
    $this->_constructSessions($row);
}

しかし、それでも面倒で醜いです。
そのため、ネイティブのプリペアドステートメントを使用することはありません。だから、私はただでそれを作ります

$sql = "SELECT * FROM CVUSERS WHERE username=?s AND password=?s";
if ($row = $db->getRow($sql,$username,$password)) {
    $this->_constructSessions($row);
}
于 2012-12-13T20:44:09.477 に答える
1

PHPページからmysqli_stmt::bind_result

Returns TRUE on success or FALSE on failure.

だから私は使用すると仮定します:

if($result){
//no errors here! success! add additional code here
}

動作します。

于 2012-12-07T17:45:57.497 に答える
0

以下のようにしてみてください

if (($res = $qu->get_result())) {
    //so your query is right
    //now check how many rows return from your query
    if($res->num_rows > 0){
       //username and password exist so logged in
    }
    else { 
       //something wrong
    }
}
于 2012-12-07T17:55:00.510 に答える
0

解決策は私が期待していたものとは少し異なることがわかりましたが、それが私の質問に対する正しい答えであるとはまだ信じていません。回答ありがとうございます。どちらも正しいと思いますが、何らかの理由で機能しませんでした:S。とにかく私はそれらの方法を自分で使用したでしょう。私は最後にこのソースコードを使用しました:

//I used $resulte in case of redeclaration.
if($qu->fetch() && $resulte === 1){
    $this->_constructSessions($username);
}
else {
    //no access
}

理由はわかりませんがif($result === 1)、操作を使用すると常にfalseが返されます。だから私はそれが代わりに文字列を返していると推測しました。ただし、if($result == 1 && $qu->fetch())この操作を使用すると、再びfalseが返されます。

私のコード全体:

$qu = $this->DBH->prepare("SELECT COUNT(*) FROM CVUSERS WHERE username= ? AND password = ? ");
$qu->bind_param('ss',$username,$password);
$qu->execute();
$qu->bind_result($resulte);     
if($qu->fetch() && $resulte === 1){
    $this->_constructSessions($username);
}
else {
    return array('error'=>true , 'content'=>'<div id="overlay"></div><div id="fail"><h1>Failed login</h1><p><a href="" id="newLogin">Click Here.</a> To request a new login</p><p><a href="" id="try">Or try again?</a></p></div>');
    sleep(1);
}

この操作がこのクエリで機能し、他の操作が機能しない理由はまだわかりません。誰かが何かを見つけることができるなら、私に知らせてください。

于 2012-12-10T15:24:01.497 に答える