sql >> データベース >  >> RDS >> Mysql

タイプboolの値の配列オフセットにアクセスしようとしています

    データベースに条件に一致するレコードが見つからなかったことが原因で、このエラーが発生している可能性があります。

    このエラーを解決する最も簡単な方法は、データベースが最初に何かを返したかどうかを確認することです。

    $emailRes = $query->fetch(PDO::FETCH_ASSOC);
    // VVV - Here I am checking if there was anything returned and then I check the condition
    if($emailRes && $emailRes['Email']==$_POST['email']) {
        // ...
    }
    

    データベースが何かを返したかどうかを気にしない場合は、デフォルト値を指定するだけです。例:

    $emailRes = $query->fetch(PDO::FETCH_ASSOC);
    $email = $emailRes['Email'] ?? ''; // default: empty string
    

    PDOを使用してDBに存在するかどうかを確認する正しい方法は、次のとおりです。

    $query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Username =:Username");
    $query->execute([':Username' => $name]);
    if ($query->fetchColumn()) {
        throw new \Exception("Username is already in use!");
    }
    
    $query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Email =:Email");
    $query->execute([':Email' => $email]);
    if ($query->fetchColumn()) {
        throw new \Exception("Email is already in use!");
    }
    

    PHPで行をフェッチして再度比較を行う代わりに、データベースから一致する行のカウントをフェッチし、そのカウントをifのブール値として使用します。 声明。 fetchColumn() 最初の行から単一の列をフェッチし、COUNT(*)を使用すると 常に1行になることはわかっています。

    1つのクエリでそれを行うこともできます:

    $query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Username =:Username OR  Email =:Email");
    $query->execute([':Username' => $name, ':Email' => $email]);
    if ($query->fetchColumn()) {
        throw new \Exception("Username or email is already in use!");
    }
    



    1. MicrosoftAccessでフォームヘッダーにタイトルを追加する方法

    2. クラウドでのデータベース負荷分散-ProxySQL2.0を使用したMySQLマスターフェイルオーバー:パート1(導入)

    3. SQLに英数字シーケンスジェネレータを使用することは可能ですか?

    4. JOINでSQLUPDATEステートメントを使用するための5つの手間のかからないヒント