【发布时间】:2015-12-29 13:48:51
【问题描述】:
我有一些使用 mysql_query 的 php 脚本,但现在我正试图将其更改为 PDO(他们说更不易受攻击且更安全),但我在条件选择查询方面遇到了一些问题。 我有以下代码:
$querydatahora = $conn->prepare('SELECT
Linhas.NomeLinha, Maquinas.Nome as maquina, Tecnicos.Nome, Avarias.DataHoraInicioAvaria,
Avarias.DataHoraFimAvaria, Avarias.Descricao, Avarias.Solucao, Avarias.TipoSolucao
FROM Avarias, Tecnicos, Linhas, Maquinas, avariatecnico
where Linhas.IDLinha = Avarias.IDLinha and avariatecnico.IDAvaria = avarias.IDAvaria and Avariatecnico.IDTecnico = Tecnicos.IDTecnico and
Maquinas.IDMaquina = Avarias.IDMaquina and DataHoraInicioAvaria >= :datetimepicker AND DataHoraFimAvaria <= :datetimepicker1 ');
if( $_SESSION['IDLinha'] ) {
$querydatahora .= $conn->prepare(" AND Avarias.IDLinha = :IDLinha AND Avarias.IDMaquina = :IDMaquina order by DataHoraInicioAvaria DESC LIMIT $startrow, 9");
} else{
$querydatahora .= $conn->prepare(" order by DataHoraInicioAvaria DESC LIMIT $startrow, 9");
}
$querydatahora->execute( array(
':datetimepicker' => $_SESSION['datetimepicker'],
':datetimepicker1' => $_SESSION['datetimepicker1'],
':IDLinha' => $_SESSION['IDLinha'],
':IDMaquina' => $_SESSION['IDMaquina'])
);
if( $_SESSION['IDLinha'] ) {
$querycount .= $conn->prepare(' AND Avarias.IDLinha = :IDLinha AND Avarias.IDMaquina = :IDMaquina');
}
$querycount->execute( array(
':datetimepicker' => $_SESSION['datetimepicker'],
':datetimepicker1' => $_SESSION['datetimepicker1'],
':IDLinha' => $_SESSION['IDLinha'],
':IDMaquina' => $_SESSION['IDMaquina'])
);
我得到的错误是:
可捕获的致命错误:无法将 PDOStatement 类的对象转换为 C:\xxxxxxxxxxxxxxxxxxxxxxxxxx.php 中第 52 行的字符串
我不是这方面的专家,所以我可能做错了什么。感谢所有帮助
【问题讨论】:
-
prepare()返回一个PDOStatement对象,这是您的异常的来源,它不是字符串。您应该只传递prepare()完整的查询,即将 SQL 查询(带占位符)生成一个字符串,然后运行 prepare()传递完整的查询字符串。 -
您需要在调用 $conn->prepare...基于该字符串。
-
我认为如果你使用 join 会更容易...