【发布时间】:2020-08-29 14:22:41
【问题描述】:
我正在为 firebase 数据库创建 Web 服务。我需要对程序 firebird 执行查询。我以这种方式使用带有 PDO 的 PHP 来执行此操作(这是我的总结代码):
$instalacion = $_REQUEST['instalacion'];
$fecha = $_REQUEST['fecha'];
$inicio = date("m/d/Y",strtotime($fecha))." ".$_REQUEST['inicio'];
$fin = date("m/d/Y",strtotime($fecha))." ".$_REQUEST['fin'];
$reserva_annio = 0;
$reserva = 0;
$numero = 0;
$serie = '';
$annio = date("Y", strtotime($fecha));
$res=$dbh->query("execute procedure INS_CREA_RESERVA (date('m/d/Y',strtotime($fecha)), $inicio, $fin, $instalacion)
returning_values($reserva_annio, $reserva, $numero, $serie); ");
我的 firebird 中的程序运行正常,但是这个查询返回了这个:
致命错误:未捕获的 PDOException:SQLSTATE[HY000]:一般错误: -104 动态 SQL 错误 SQL 错误代码 = -104 令牌未知 - 第 3 行,第 25 列“0”
这个错误告诉我失败的部分是返回值行。但在我的火鸟中工作正常。
我可能需要在 php.ini 或类似的东西中安装一个库吗?我已经激活了这个:extension=pdo_firebird,但不工作。
对我的错误有什么建议吗?谢谢!
【问题讨论】:
-
我认为这行不通 -
returning_values($reserva_annio- 这对我来说毫无意义。要将值推回应用程序,您的服务器应该被赋予变量(C++ 术语中的 LVALUE),而不是常量(RVALUE)!尽管出于多种原因将值拼接到 SQL 文字中是一件坏事,即使对于只读值也是如此。见bobby-tables.com/php -
是的,你是对的。在网上研究之后,我发现这可以通过更简单的选择查询来完成。我为将来可能出现的错误提出了解决方案。谢谢!
-
我还是强烈建议你反对字符串拼接!一定要使用参数。它更具可预测性和安全性。特别是,您不需要所有这些
date('m/d/Y'并猜测有关此或该 SQL 服务器的文本日期时间格式的工作。并且您将能够prepare经常使用的查询,因此您可以重新运行它们而无需重新编译,只需更改参数值。 -
RETURNING_VALUES子句仅用于 PSQL(存储过程代码),不适用于 DSQL。部分问题在于您使用的是字符串插值(这会使您的代码容易受到 SQL 注入的影响),而不是实际参数。 -
是的,没错。我只是写了示例代码,为了清楚起见,我这样发布它。实际上,查询当然是在准备好的语句下构建的。
标签: php pdo firebird procedure