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

日付のPDObindParamが機能しない

    これがあなたの主な問題です:

    if ($stmt->fetchColumn()>=1) {
        $result = $stmt->fetchAll();
    }
    else{
        $result = 'nope';
    }
    

    fetchColumn()を呼び出すと、結果セットが最初の行を超えて進みます。次に、fetchAll()を呼び出すと、残りのみがフェッチされます。 行。戻って最初の行をフェッチすることはできません。それは失われます。したがって、クエリ結果に1行しかない場合は、表示されません。

    代わりに、次のコードをお勧めします:

    $result = $stmt->fetchAll();
    if (empty($result)) {
      $result = "nope";
    }
    

    その他のヒント:

    パラメータのプレースホルダーを引用符で囲まないでください。そうした場合、それらはパラメータのプレースホルダーではなくなり、「:befDate」のようなリテラル文字列になります。これらは有効な日付リテラルではありません。

    BETWEEN :befDate AND :aftDateのような式のパラメーター BETWEEN 2016-07-17 AND 2016-07-25を作成しないでください クエリとして。パラメータがそのような式になることはなく、パラメータごとに常にスカラー値(引用符で囲まれた日付リテラルなど)になります。

    私はあなたのコードを試しました。まず、MySQLの一般的なクエリログを有効にしました:

    mysql> SET GLOBAL general_log = ON;
    

    これで、MySQLがPDOによって送信されたクエリであると考えていることが正確にわかります。 PHPスクリプトを実行し、一般的なクエリログ(仮想マシンの/var/lib/mysql/localhost.log)を読み取りました:

    160716 19:26:16     8 Connect   [email protected] on test
                8 Query SELECT * FROM `flights` WHERE `date` BETWEEN NULL AND NULL 
                         AND `from` = NULL 
                         AND `to` = NULL 
                         AND `weight` >= NULL
                8 Quit  
    

    ああ、パラメータにバインドされた変数の値を設定するのを忘れました。これらの変数のいずれにも値がない場合は、NULLとの比較が真ではないため、結果が空である理由が説明されます。そこで、PHPを編集して、最初にサンプル値を変数に設定しました。

    $befDate = '2016-07-21';
    $aftDate = '2016-07-28';
    $from = 1;
    $to = 2;
    $weight = 10;
    

    クエリを再度実行すると、ログに次のように表示されます。

    160716 19:33:17    13 Query SELECT * FROM `flights` WHERE `date` BETWEEN '2016-07-21' AND '2016-07-28' 
                         AND `from` = 1 
                         AND `to` = 2 
                         AND `weight` >= 10
    

    これは、PDOがパラメーター化された値(文字列または日付の場合)を引用符で囲んでいることを証明しています。




    1. 修正方法:「SQLServerAgentは現在実行されていません…」

    2. Oracle 11gでユーザーを作成し、権限を付与する方法

    3. ORA00918-列があいまいに定義されたエラー

    4. レコードを時間ごとまたは日ごとにグループ化し、mysqlでギャップをゼロまたはnullで埋めます