Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php bindParam未完成sql查询_Php_Sql_Pdo - Fatal编程技术网

Php bindParam未完成sql查询

Php bindParam未完成sql查询,php,sql,pdo,Php,Sql,Pdo,我不熟悉PDO语句,到目前为止,我一直在使用它,使用准备好的语句和很多东西,直到今天 我有两个查询,第一个检索一些数据,存储结果,然后第二个查询使用这些数据检索最终数据。我在一个设计糟糕的数据库上工作,这就是为什么我要做一些奇怪的事情 第一个查询获取体育联赛的开始年份和结束年份。然后,将年份传递给第二个查询,以获取这些年份之间的数据(其中) 问题是bindParam似乎不起作用,它没有绑定参数,显示一个?,然后SQL抛出以下异常: Connection failed: SQLSTATE[4200

我不熟悉PDO语句,到目前为止,我一直在使用它,使用准备好的语句和很多东西,直到今天

我有两个查询,第一个检索一些数据,存储结果,然后第二个查询使用这些数据检索最终数据。我在一个设计糟糕的数据库上工作,这就是为什么我要做一些奇怪的事情

第一个查询获取体育联赛的开始年份和结束年份。然后,将年份传递给第二个查询,以获取这些年份之间的数据(其中)

问题是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;

如果使用绑定参数,则不应在查询中传入硬编码值

"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;";

如果使用绑定参数,则不应在查询中传入硬编码值

"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;";

毫无疑问,您正在生成无效的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')

相反。

理所当然,您正在生成无效的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')

相反。

您不能以这种方式在查询中连接字符串。将您的查询更改为

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
bindParam
s

$stmt->bindValue(':anoInicio', $fetched[0][0] . '0701', PDO::PARAM_STR);
$stmt->bindValue(':anoFinal', $fetched[0][1] . '0630', PDO::PARAM_STR);

不能以这种方式连接查询中的字符串。将您的查询更改为

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
bindParam
s

$stmt->bindValue(':anoInicio', $fetched[0][0] . '0701', PDO::PARAM_STR);
$stmt->bindValue(':anoFinal', $fetched[0][1] . '0630', PDO::PARAM_STR);

我认为与单个配额相关的错误
'0701'
'0630'
,请将它们转义并重试
'0701'
之后的
:anoInicio
'0630'
之后的
:anoFinal
应该是什么?这是试图将数字与绑定变量连接起来吗?@MarkBaker Month and day。结果应该是:“YearMonthDay”,比如“20130701”。这个数据库没有使用标准的时间戳,工作起来很麻烦。然后,在绑定之前,您需要将这些文本连接到$fetched值,而不是像Olaf在他的回答中所显示的那样,尝试将它们嵌入到您的语句中。我认为错误与单个配额有关
'0701'
'0630'
,逃离它们,再试一次
:anoInicio
之后的
'0701'
,或者
:anoinal
之后的
'0630'
应该是什么?这是试图将数字与绑定变量连接起来吗?@MarkBaker Month and day。结果应该是:“YearMonthDay”,比如“20130701”。这个数据库不使用标准的时间戳,工作起来很麻烦。然后你需要在绑定之前将这些文本连接到$fetched值,而不是像Olaf在他的回答中所说的那样尝试将它们嵌入到你的语句中。如果我这样做,引发此异常:
致命错误:无法在
$stmt->bindParam(':anoInicio',$fetched[0][0].'0701',PDO::PARAM_STR,12)处通过引用传递参数2好,我必须定义变量,而不是传递数组<代码>$foo=$fetched[0][0]$stmt->bindParam(':anoInicio',$foo'.0701',PDO::PARAM_STR,12)
如果我这样做,将引发此异常:
致命错误:无法在
$stmt->bindParam(“:anoInicio',$fetched[0][0]。'0701',PDO::PARAM_STR,12)处通过引用传递参数2好,我必须定义变量,而不是传递数组<代码>$foo=$fetched[0][0]$stmt->bindParam(':anoInicio',$foo'.0701',PDO::PARAM_STR,12)谢谢,终于成功了。Olaf方法仍然会导致错误。谢谢,这终于奏效了。Olaf方法仍然会导致错误。