を働いていない、私はフライトの検索結果を返すためにPHPの関数を作っていた、これは私のコードです:PDO bindParamは、日付のために、私はPDOでの初心者です
$db = DB::getConnection();
$stmt = $db->prepare("SELECT * FROM `flights` WHERE `date` BETWEEN :befDate AND :aftDate
AND `from` = :from
AND `to` = :to
AND `weight` >= :weight");
$stmt->bindParam(':befDate', $befDate, PDO::PARAM_STR); //$befDate = '2016-07-21';
$stmt->bindParam(':aftDate', $aftDate, PDO::PARAM_STR); //$aftDate = '2016-07-28';
$stmt->bindParam(':from', $from, PDO::PARAM_INT);
$stmt->bindParam(':to', $to, PDO::PARAM_INT);
$stmt->bindParam(':weight', $weight, PDO::PARAM_INT);
$ok = $stmt->execute();
if ($ok) {
if ($stmt->fetchColumn()>=1) {
$result = $stmt->fetchAll();
}
else{
$result = 'nope';
}
return $result;
}
else{
return false;
}
問題は、それが常に0を返すされていますの検索結果。私は私のSQLを実行しようとしたPDOによって生成されたSQLがあるので、phpMyAdminの中に手動で機能を介して生成し、その問題があるが見つかりました:
"SELECT * FROM `FLIGHTS` WHERE `DATE` BETWEEN '2016-07-17' AND '2016-07-25' AND `FROM` = 1237 AND `TO` = 2380 AND `WEIGHT` >= 4"
:
"SELECT * FROM `FLIGHTS` WHERE `DATE` BETWEEN 2016-07-17 AND 2016-07-25 AND `FROM` = 1237 AND `TO` = 2380 AND `WEIGHT` >= 4"
私は結果がでなければなりません取得しています、そこから正しいSQLながら、
つまり、一重引用符で囲まれた日付の値です。私はPDOでの私のSQLに引用符を追加した場合、今のように:エラー:
$stmt = $db->prepare("SELECT * FROM `flights` WHERE `date` BETWEEN ':befDate' AND ':aftDate'
AND `from` = :from
AND `to` = :to
AND `weight` >= :weight");
は、私が「束縛変数の数がトークンの数と一致していない無効なパラメータ番号」を取得します。 事前にお手伝いいただきありがとうございます!
UPDATE:
私の "フライト" のテーブル構造は次のとおりです。
CREATE TABLE `flights` (
`fid` int(30) NOT NULL,
`user_id` int(30) NOT NULL,
`date` date NOT NULL,
`from` int(30) NOT NULL,
`to` int(30) NOT NULL,
`weight` int(30) NOT NULL,
`size` varchar(30) NOT NULL,
`details` varchar(200) NOT NULL,
`price` int(50) NOT NULL,
`airline` varchar(100) NOT NULL,
`pnr` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
私は、クエリからすべての引用符を削除しようとしただけでなく、単一の切れ目のないラインにそれを置く:
$stmt = $db->prepare("SELECT * FROM flights WHERE date BETWEEN :befDate AND :aftDate AND from = :from AND to = :to AND weight >= :weight");
まだ動作していません...
UPDATE 2 paramsをPDO(一重引用符のない文)にバインドした後のSQL文の様子を調べるには、関数の最初にSQLと同じセッション変数を作成し、結果を表示するようにエコーしました。
$_SESSION['err'] = "SELECT * FROM flights WHERE date BETWEEN $befDate AND $aftDate
AND from = $from
AND to = $to
AND weight >= $weight";
それがそのまま動作するはずですが、そこに何かがあると思います。「正しい」SQLが実際に動作するのは確かですか?たぶんdatetime列がありますか? – Mihai
あなたのコードに '// $ befDate = '2016-07-21''と' // $ aftDate =' 2016-07-28 'と言ったコメントがあることに気付くことはできません。出力は「BETWEEN」2016-07-17 'AND' 2016-07-25'''となると予想しています。これはおそらく結果が得られない理由です。 –
質問を編集して私の質問に答えました。そうでなければ出力はphpMyAdminで働いています – Echoes