0

次のように PDO を使用して実行したい単純な SQL クエリがあります。

try {
    //connect to server
    $dbh = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME, DBUSER, DBPASS);
    //check if username is valid
    $q="SELECT COUNT(*), first FROM users WHERE email='".$_POST['email']."'";
    echo $q;
    $stmt=$dbh->prepare($q);
    $stmt->execute();
    $f=$stmt->fetch();
    echo $f[0];
    echo $f[1];
catch (PDOException $e) {
    echo "There was an internal error resetting your password.";
  die();
}

echo $q の出力は次のとおりです。

SELECT COUNT(*) first FROM users WHERE email='ahg44@cornell.edu'

これをコピーして phpmyadmin の SQL タブに貼り付けると、クエリは探しているタプルを正常に返します。ただし、php コードでは何も返されません。

さらに、私が呼び出すと: $stmt->debugDumpParams(); クエリの後に、これが出力されます。

SQL: [64] SELECT COUNT(*), first FROM users WHERE email='ahg44@cornell.edu' Params: 0

最初は、POST 変数の読み取りエラーだと思ったので、ハードコーディングしました。

$q="SELECT COUNT(*), first FROM users WHERE email='ahg44@cornell.edu'";

元のクエリの代わりに使用しましたが、これで同じ結果が得られました。

さらに、クエリを次のような単純なものに変更すると:

$q="SELECT COUNT(*), first FROM users

コードは正常に動作します。

奇妙なことに、このクエリは昨日完全に機能したため、今日コードをクリーンアップしているときに小さなエラーが発生したに違いありません。問題はエスケープ文字に関係していると思いますが、オンラインでしばらく検索していて、解決策が見つかりませんでした。ありがとう!

4

2 に答える 2

0

PDO の使い方が間違っています。次のように、準備済みステートメントを使用する必要があります。

$q = "SELECT COUNT(*), first FROM users WHERE email = ?";
$stmt = $dbh->prepare( $q);
$stmt->execute( array( $_POST['email']));
$f = $stmt->fetch();
于 2012-06-28T15:18:12.167 に答える
0

質問に貼り付けたPHPは正しいように見えますが、実行中のコードに実際にはカンマがないようです..

この行:

SQL: [64] SELECT COUNT(*) first FROM users WHERE email='ahg44@cornell.edu' 

COUNT(*)の後にカンマが表示されないため、別の列として選択されるのではなくfirst、列のエイリアスになります。COUNT(*)

于 2012-06-28T15:16:57.610 に答える