2016-04-24 18 views
0

この短いコードを動作させるためにさまざまなことを試しました。それはPDOを介してデータベースに接続し、ポスト変数に一致するすべての行を選択することです。行数が0より大きい場合は、licensekey行を "used"に更新してtrueを返します。PDO rowCountとfetchColumnの両方が正しい結果を返さない

sqlのrowcountとfetchcolumnとcount(*)の両方を試してみましたが、違いはありません。 MySQL自体では、有効なライセンスキーを使用しましたが、実際には1行を返します。

<?php 
if(isset($_POST['licensekey'])) { 

try { 
    $db = new PDO("mysql:host=localhost;dbname=validation", "test", "test"); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
    die($e->getMessage()); 
} 

$search = ("SELECT * FROM validated WHERE activationkey=:lk AND used='0'"); 
$result = $db->prepare($search); 
$result->bindParam(":lk", $_POST['licensekey']); 
$result->execute(); 

if($result->rowCount() > 0) { 
    $used = ("UPDATE validated SET used='1' WHERE validated.activationkey=:lk"); 
    $result2 = $db->prepare($used); 
    $result2->bindParam(":lk", $_POST['licensekey']); 
    $result2->execute(); 

    echo "true"; 
} else { 
    echo "false"; 
} 

$db = null; 
} else { 
    exit(); 
} 
?> 

何時でも偽を返します。

ここで問題と思われるものは何ですか?

+0

MySQLクライアントでテストしたのと同じデータベースに接続されていることは確かですか?例外が有効になっているので、 'echo" false "が実行される前に問題が発生します。クエリから 'activationkey =:lk AND'を削除し、' bindParam() '呼び出しをパラメータなしで実行するためにコメントアウトすると、' rowCount() 'はテーブルにいくつかの行が存在すると仮定してもまだゼロですか? –

+0

'rowCount()'はSELECTクエリのMySQLのいくつかのバージョンで動作しますが、古い5.1と5.6の両方に対してテストしました。 –

+0

私は 'bindparam'をコメントアウトし、クエリーを変更して' SELECT * FROM validated'を実行しました。 - それは今ではtrueを返しますが、それは私がまだ混乱しているところです。私は 'isset'でチェックするので、ライセンスキーが投稿されているので、それがそこにあり、行きたいと思っています。ライセンスキーはコピーしたものとまったく同じですが、投稿されたケースではfalseを返します。ここで何が起こっているのか分かりません。 – Joel

答えて

-1

実際には、rowCount関数を使用してDBで選択されたレコードの数は確認できません。 PHPドキュメンテーションで読んでいるように、selectクエリの多くはrowCountメソッドを使ったクエリの影響を受ける行の数を返しません。詳細については、こちらをご覧ください:http://php.net/manual/en/pdostatement.rowcount.php

fetchColumnメソッドを使用することができます。

関連する問題