0

私はPDOステートメントに不慣れであり、これまでのところ、今日まで、PDOステートメントを操作し、準備されたステートメントや多くのものを使用することができました。

2つのクエリがあります。最初のクエリはデータを取得して結果を保存し、2番目のクエリはそのデータを使用して最終的なデータを取得します。私は悪い設計のDBに取り組んでいるので、奇妙なことをしなければなりません。

最初のクエリは、スポーツリーグの開始年と終了年を取得します。次に、その年が2番目のクエリに渡され、それらの年の間のデータが取得されます(WHERE)。

問題は、bindParamが機能していないように見え、パラメーターをバインドせず、?を表示し、SQLが次の例外をスローすることです。

Connection failed: SQLSTATE[42000]: Syntax error or access violation:
1064 You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use
near ''0701' AND ?'0630' ORDER BY e.FECHA DESC' at line 5

SQL:

$sqlQueryAuxiliar = "SELECT ano_inicio, ano_fin
                     FROM TEMPORADAS
                     ORDER BY ano_inicio DESC
                     LIMIT 1;";

$sqlQuery = "SELECT  e.id, e.JORNADA, DATE_FORMAT(e.FECHA, '%Y-%m-%d'),
             e.HORA, c1.nombre_temporada, c2.nombre_temporada
             FROM    ENCUENTROS AS e
             JOIN    CLUBS AS c1 ON (e.COD_EQUIL = c1.siglas)
             JOIN    CLUBS AS c2 ON (e.COD_EQUIV = c2.siglas)
             WHERE   e.FECHA BETWEEN :anoInicio'0701' AND :anoFinal'0630'
             ORDER BY e.FECHA DESC;";

そしてこれはPHPコードです:

$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmtAux = $this->_db->prepare($sqlQueryAuxiliar);
$stmtAux->execute();
$fetched = $stmtAux->fetchAll();
$stmtAux = null;
$stmt = $this->_db->prepare($sqlQuery);
$stmt->bindParam(':anoInicio', $fetched[0][0], PDO::PARAM_STR, 12);
$stmt->bindParam(':anoFinal', $fetched[0][1], PDO::PARAM_STR, 12);
$stmt->execute();
while ($row = $stmt->fetch()) {
    $partidos[] = $row;
}
$stmt = null;
4

3 に答える 3

2

この方法でクエリ内の文字列を連結することはできません。クエリをに変更します

SELECT  e.id, e.JORNADA, DATE_FORMAT(e.FECHA, '%Y-%m-%d'), e.HORA, c1.nombre_temporada, c2.nombre_temporada
              FROM    ENCUENTROS AS e
              JOIN    CLUBS AS c1 ON (e.COD_EQUIL = c1.siglas)
              JOIN    CLUBS AS c2 ON (e.COD_EQUIV = c2.siglas)
              WHERE   e.FECHA BETWEEN :anoInicio AND :anoFinal
              ORDER BY e.FECHA DESC

bindParams

$stmt->bindValue(':anoInicio', $fetched[0][0] . '0701', PDO::PARAM_STR);
$stmt->bindValue(':anoFinal', $fetched[0][1] . '0630', PDO::PARAM_STR);
于 2013-03-11T16:43:43.337 に答える
1

当然のことながら、無効なSQLを作成しています。

 WHERE   e.FECHA BETWEEN :anoInicio'0701' AND :anoFinal'0630'

基本的に構築されます

 WHERE e.FETCHA BETWEEN foobar'0701' AND barbaz'0630'

これは構文エラーです。

あなたはおそらくしたい

WHERE e.FETCH BETWEEN concat(:anoInicio, '0701') AND concat(:anoFinal, '0630')

代わりは。

于 2013-03-11T16:43:37.940 に答える
0

バインドされたパラメータを使用している場合は、クエリでハードコードされた値も渡さないでください。

"SELECT  e.id, e.JORNADA, DATE_FORMAT(e.FECHA, '%Y-%m-%d'), e.HORA, c1.nombre_temporada, c2.nombre_temporada
          FROM    ENCUENTROS AS e
          JOIN    CLUBS AS c1 ON (e.COD_EQUIL = c1.siglas)
          JOIN    CLUBS AS c2 ON (e.COD_EQUIV = c2.siglas)
          WHERE   e.FECHA BETWEEN :anoInicio AND :anoFinal
          ORDER BY e.FECHA DESC;";
于 2013-03-11T16:43:36.090 に答える