【问题标题】:Query works from pgAdmin. Won't work from PHP with no errors查询从 pgAdmin 工作。不能在没有错误的情况下使用 PHP
【发布时间】:2013-03-30 22:26:32
【问题描述】:

我正在为我的客户重建应用程序。我编写脚本将数据从旧数据库迁移到新数据库。为了防止 etiquette_start 列中的空值(旧数据库中发生的情况),我运行

UPDATE items 
SET etiquette_start = 'E' 
WHERE trim(both ' ' from etiquette_start) = '' 
OR etiquette_start is null;

在导入数据之后。问题是脚本在 pgAdmin III 上运行良好,但它不会在 php 脚本上执行。 PHP 语法错误不是这里的问题 - 将其他查询放在上面引用的变量保存查询中导致成功的数据操作。页面和日志中没有 PHP 错误。

【问题讨论】:

  • 为您的 WHERE 子句寻找更简单的 SQL 解决方案。
  • 如果 db 中没有类似字符串的 ' ' 而不仅仅是空值或空值,则问题可以轻松解决。有什么建议吗?
  • 数据库日志说什么?设置log_statement=all 并重试。数据库实际上得到了什么?
  • 你的 php 代码是什么样的?

标签: php postgresql phppgadmin


【解决方案1】:

试试这个:

UPDATE items 
SET etiquette_start = 'E' 
WHERE length(trim(both ' ' from etiquette_start)) = 0 
OR etiquette_start is null;

【讨论】:

  • 表达式length(trim(both ' ' from etiquette_start)) = 0完全trim(both ' ' from etiquette_start) = ''相同,而trim(both ' ' from etiquette_start) = ''完全trim(etiquette_start) = ''相同。 根本没有理由这样做
  • @Erwin 你是完全正确的,但你可能没有仔细阅读这个问题。作者遇到了 PHP 问题,而不是 Postgres。
  • 所提出的替代方案对 PHP 有什么帮助? OP 有一个不相关的问题,该问题未正确涵盖。
  • @ErwinBrandstetter - 从问题中应该很清楚,作者不知道如何正确地写下空字符串常量作为他在 PHP 中的 sql 查询的参数。由于我们没有看到我建议的sql查询代码,他不必使用空字符串。
  • 从问题中不清楚根本,尤其是语句中有更多的单引号。
【解决方案2】:

无论哪种方式,您都可以简化trim() 调用并防止空更新:

UPDATE items 
SET    etiquette_start = 'E'
WHERE (trim(etiquette_start) = '' OR etiquette_start IS NULL) -- parens needed
AND    etiquette_start IS DISTINCT FROM 'E';

由于空格 (' ') 是 trim() 删除的默认字符,因此这些表达式是 100% 等效的:

trim(etiquette_start)

trim(both ' ' from etiquette_start

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2021-03-09
    • 2014-09-21
    相关资源
    最近更新 更多