この短いコードを動作させるためにさまざまなことを試しました。それは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();
}
?>
何時でも偽を返します。
ここで問題と思われるものは何ですか?
MySQLクライアントでテストしたのと同じデータベースに接続されていることは確かですか?例外が有効になっているので、 'echo" false "が実行される前に問題が発生します。クエリから 'activationkey =:lk AND'を削除し、' bindParam() '呼び出しをパラメータなしで実行するためにコメントアウトすると、' rowCount() 'はテーブルにいくつかの行が存在すると仮定してもまだゼロですか? –
'rowCount()'はSELECTクエリのMySQLのいくつかのバージョンで動作しますが、古い5.1と5.6の両方に対してテストしました。 –
私は 'bindparam'をコメントアウトし、クエリーを変更して' SELECT * FROM validated'を実行しました。 - それは今ではtrueを返しますが、それは私がまだ混乱しているところです。私は 'isset'でチェックするので、ライセンスキーが投稿されているので、それがそこにあり、行きたいと思っています。ライセンスキーはコピーしたものとまったく同じですが、投稿されたケースではfalseを返します。ここで何が起こっているのか分かりません。 – Joel