2016-06-19 24 views
3

私の電子メールがデータベースに存在するかどうかを判断しようとしています。この目的のために私は、コードのこの部分を書く:MySQL - select countがtrueを返します

$query_checkmail = "SELECT COUNT(*) FROM user WHERE email = ?;"; 
if($stmt = mysqli_prepare($connection, $query_checkmail)) 
{ 
    mysqli_stmt_bind_param($stmt, "s", $_POST["email"]); 
    $result = mysqli_stmt_execute($stmt); 
    mysqli_stmt_close($stmt); 
} 

echo "<pre>"; 
var_dump($result, mysqli_fetch_all($result)); 
echo "</pre>"; 

メールがデータベースにすべきではないので、私は、クエリが0を返すことを期待しているので、出力は(var_dumpから)これです:

bool(true) 
NULL 

なぜ値を0にするmysqli結果オブジェクトが得られないのかわかりませんが、それをチェックしたい場合は、常にPHP警告をトリガーするブール値trueです。

私は前に正常なSELECT id FROM user WHERE email = ?;";を持っていて、同じ結果を得ました。私はCOUNTでこれを防ぐことができると思ったが、私の試みは明らかに失敗した。

私はこのStackoverflow Linkを見つけましたが、不幸にも、値が既に存在するかどうかを知るという私の問題を解決するのに役立たなかったのです。

ご協力いただきまして誠にありがとうございます。この情報が十分でない場合は、欠落しているビットを即時に提供します。

+0

メールが存在するかどうかを確認した後、あなたは何をしますか? – Strawberry

+0

これは新しいユーザーを追加するプロセスです。ログイン資格情報の一部であるため一意でなければならないので、この特定の電子メールアドレスを持つユーザーを持つ必要はありません。したがって、この電子メールアドレスを持つユーザーが既に存在するかどうかを確認する必要があります。はいの場合はエラーを返し、そうでない場合は続行できます。このメールアドレスには誰もいないのに「TRUE」という結果が得られます。 – JRsz

+0

UNIQUEキーを設定してメールを送信するだけです。挿入された結果は、電子メールが存在するかどうかを伝えます。 – Strawberry

答えて

3

カウント自体はブール値trueまたはfalseを返しません。mysqli_stmt_execute()から割り当てられた変数をチェックしています。ブール値を返します。これはクエリの結果とは関係ありません。この関数のドキュメント、特に戻り値がmysqli_stmt_execute()の場合は、trueまたはfalseのいずれかであることがわかります。var_dump()がブール値を返すことは驚くことではありません。

実際のカウントを希望する場合は、mysqli_stmt_bind_result()mysqli_stmt_fetch()を使用してカウントを取得する必要があります。これにより正しい結果が得られます。このマニュアルでは、これらの機能の使い方がわからない場合の例を示します。 NULLについては

あなたがmysqli_resultを期待mysqli_fetch_all()機能、にブール値を渡しているので、あなたはそれをからboolean値を与えている一方で、それは、です上記の理由。

0

mysqliの代わりにPDOを使用することをお勧めします。最初に接続し、次に:

$stm = $pdo->prepare("select count(*) from user where email = :email"); 
    $stm->bindValue(':email', $_POST['email'], PDO::PARAM_STR); 
    if ($stm->execute()) { 
     $c = $stm->fetchColumn();   
    echo $c;  
    } 
+0

私はPDOが好きではありませんし、決してそれを使用していないし、コードの私の多くのラインで一貫しているために、私はこの特定の問題にこれを使用することはできません。 – JRsz

0

あなたは、完璧なPHP MySQLのライブラリですMeekroDBを使用することができます。たとえば、このコード行では、同様の結果が得られます。

$user = DB::query("SELECT UserId FROM user WHERE email = %s",$email); 
$count = DB::count(); 

ご覧のとおり、コードはよりクリーンで簡単に記述できます。 Meekroはフリーでオープンソースです:​​

1

mysqli_stmt_executeあなたはデータ

私はPHPからのサンプルコードをコピーを取得するためにexcute後mysqli_stmt_get_result使用する必要があり、trueまたはfalseを返します。NET

$result = mysqli_stmt_get_result($stmt); 
while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) 
{ 
foreach ($row as $r) 
{ 
print "$r "; 
} 
print "\n"; 
} 
+0

あなたのコードは私には役に立ちませんが、テキストは役に立ちます。私の問題を修正したコードにQuirelsが答えたときの私の編集を見てください。しかし、あなたの答えをありがとう:)私はあなたのコードを質問に一致するように更新することをお勧めします – JRsz

関連する問題