【问题标题】:Query returns 0 results in php, but in oracle SQL developer it returns 52 results查询在 php 中返回 0 个结果,但在 oracle SQL 开发人员中返回 52 个结果
【发布时间】:2015-08-20 07:34:39
【问题描述】:

我的 oracle 查询有问题。当我在 PHP 中运行它时,它返回 0 个结果。如果我在 Oracle SQLDeveloper 中运行相同的查询,它会返回 52 个结果。

这是 PHP 中的查询:

SELECT name , zipcity FROM  import_persons WHERE upper(:zoekop) LIKE '%:zoekwaarde%' AND status < 3 ORDER BY name
$parameters = array(':zoekop' => $zoekop, ':zoekwaarde' => $zoekwaarde);

我在 SQLDeveloper 中运行的查询,手动填写了变量。(从 PHP 中的 echo 复制它们)。

SELECT  name , zipcity FROM import_persons WHERE upper(name) LIKE '%Q%' AND status < 3 ORDER BY name

我似乎找不到错误,在询问之前,我尝试绑定参数,但没有成功。

【问题讨论】:

  • 我已将附录答案移至其自己的答案帖子中,因此问题和答案很好地分开(主要对数据提取和 API 用户有帮助)。

标签: php sql oracle


【解决方案1】:

这里有两个问题:

SELECT name , zipcity FROM  import_persons
    WHERE UPPER(:zoekop) LIKE '%:zoekwaarde%' AND status < 3
    ORDER BY name

使用绑定参数很好,但不幸的是只能绑定值;由于:zoekop 是列的占位符,因此您必须使用传统的字符串连接(如果列名来自用户输入,请使用白名单以确保安全)。

您可以为:zoekwaarde 绑定,但通配符必须是您绑定的字符串的一部分,而不是在查询中。因此,您的 SQL 看起来有点像这样:

SELECT name , zipcity FROM  import_persons
    WHERE UPPER(zoekop_col) LIKE :zoekwaarde AND status < 3
    ORDER BY name

请注意,查询不包含引号 - 它们不是必需的,因为绑定系统知道您在此位置绑定的参数的类型。总结一下,您现在只需绑定一个参数:

$parameters = array(':zoekwaarde' => "%{$zoekwaarde}%", );

【讨论】:

  • 没有问题@McBurgerKong,很高兴它成功了!
  • @McBurgerKong:在您的查询调用中添加一些错误检查可能值得 - 我认为原始代码应该导致错误,但我想知道您是否没有看到。对于数据库,尽可能多地在运行时检查错误总是好的。
  • 现在你说我确实应该这样做。执行时我没有看到任何错误,但如果我使用 PDO 函数 errorCode 和 errorInfo 进行检查,我可能会在前面看到。不过感谢您的建议
  • 是的@McBurgerKong,您需要明确地测试错误,现在仍然值得这样做。当然,不要在生产中向用户显示技术错误——只在开发/暂存中。
  • 是的,这确实值得您花时间。 @halfer 我永远不会这样做,我只在我的测试服务器上显示东西,当我部署时,我确保每个调试信息都是隐藏的。
【解决方案2】:

我不懂 PHP,所以这有点猜测,但我想知道

LIKE '%:zoekwaarde%' 

将变量名称作为文字字符串,您可以使用

之类的东西更好
LIKE '%' || :zoekwaarde || '%'

【讨论】:

  • 感谢您的快速响应,我已经尝试过了,但在 PHP 中仍然没有结果。 SQLDeveloper 仍然给出结果,即使您建议进行编辑
  • 我唯一的其他建议是硬编码 PHP 代码中的值,以证明这是变量的问题。但由于我不了解 PHP,我将不得不放弃这一点,祝你找到解决方案好运。
【解决方案3】:

(代表 OP 发布。)

感谢 halfer 的回答,我能够解决问题。修复:

$query_01 = "SELECT name , zipcity FROM  import_persons WHERE upper(name) LIKE :zoekwaarde AND status < 3 ORDER BY name";
$parameters = array(':zoekwaarde' => "%{$zoekwaarde}%", );

【讨论】:

  • OP,如果您想添加自己的答案(这样您可能会因此而获得支持),请告诉我,我可以删除这个答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多