【问题标题】:Using PHP/PDO to set a NULL value使用 PHP/PDO 设置 NULL 值
【发布时间】:2014-04-21 15:04:47
【问题描述】:

使用 PHP/PDO 我试图设置一个名为“flt_status”的 MySQL (mysql-5.0.96) 变量,其默认设置为“NULL”,定义为 INT(5),可为空,为 NULL。

StackOverFlow (11692773, 1391777) 上有许多讨论这个主题的主题,但它们似乎都不适合我。

我的(非常简略的)代码如下所示;

$vs = “:ip, flt_status, sunrise”;

$match = array( 
‘:ip’=>”$ip”, 
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);

$vars = “ip, flt_status, sunrise”;

$sql = "INSERT INTO skeds ( $vars ) VALUES ( $vs )";

$query = $db_found->prepare( $sql );

$query->execute(  $match );

我尝试了上述讨论中概述的一些技术以及我使用 Google 发现的其他技术,但每次 flt_status 的值都为零 (0)。我试过同时使用 PDO::PARAM_NULL 和 PDO::PARAM_INT。

我在这个例子中包含了 IP 和 SUNRISE 变量,这样我就可以更好地理解那些更有经验的 PHP/PDO 程序员给我的例子。

谁能告诉我我做错了什么?

提前感谢您提供的任何帮助。

【问题讨论】:

  • 您在此处提供的示例代码中使用的,是"(双引号)还是其他?
  • 我个人已经注意到,如果我将 NULL 分配给查询中的字段,它不能用引号引起来,否则它将被设置为字符串。但是,field=NULL 往往对我有用。

标签: php mysql pdo null


【解决方案1】:

你做错了几件事。

$vs = “:ip, flt_status, sunrise”;

首先,您显然使用的是智能引号而不是直引号。代码需要直引号。

接下来,您在 ip 之前放置了一个 : 前缀,但您在其他两个命名参数之前错过了该前缀。在每个之前你需要一个:

$match = array( 
‘:ip’=>”$ip”, 
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);

接下来,您将null 放在带引号的字符串中。这使它成为包含单词'null' 的字符串文字,而不是真正的空值。这两个概念是不同的,就像一只鸡和一张写着“鸡”字的纸的区别。

另外,您不需要在变量周围加上引号。

此外,对于它的价值,数组的数组键上的 : 前缀是可选的。在 PDO 的早期版本中,它们是强制性的,但现在不是。保留冒号前缀并没有什么坏处,我只是想让你知道,因为它可以让将来从另一个关联数组(如 $_POST)准备参数数组变得更容易。

$vars = “ip, flt_status, sunrise”;

这很好,除了继续使用智能引号。

$sql = "INSERT INTO skeds ( $vars ) VALUES ( $vs )";

$vs 在这里会遇到麻烦,因为它只包含一个参数占位符,后跟两个普通的列名。在 VALUES 子句中传递列名在 SQL 中不是非法的,但这样做没有任何意义。

$query = $db_found->prepare( $sql );
$query->execute(  $match );

好的,只是您不检查错误。除非您启用了 PDO 的抛出异常的属性,否则您需要检查 prepare()execute() 的返回状态,因为如果有任何错误,它们会返回 false。这仍然是 PHP 开发人员最常见的错误之一!


这就是我将如何编写此代码。

当您连接到 PDO 时,启用例外。见http://php.net/manual/en/pdo.error-handling.php

$db_found = new PDO(...);
$db_found->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

那么这个例程的代码:

$placeholders = ":ip, :flt_status, :sunrise";

$values = array( 
    'ip'         => $ip, 
    'flt_status' => null,
    'sunrise'    => $sunrise
);

$columns = "ip, flt_status, sunrise";

$sql = "INSERT INTO skeds ($columns) VALUES ($placeholders)";

$stmt = $db_found->prepare($sql);

$stmt->execute($values);

【讨论】:

  • 我认为智能引号是由于我在将帖子发布到网站之前在编辑器中输入帖子造成的。对不起大家,不会再发生了。
【解决方案2】:

您的代码中几乎没有错误,请尝试像这样调整它:

$sql = "INSERT INTO skeds ( ip, flt_status, sunrise ) VALUES ( :ip, :flt_status, :sunrise )";
$query = $db_found->prepare( $sql );
$query->execute( array(':ip'=> $ip, 
                       ':flt_status'=>null,
                       ':sunrise'=>$sunrise
));

【讨论】:

    【解决方案3】:

    当你说

    $match = array( 
    ‘:ip’=>”$ip”, 
    ‘:flt_status’=>”null, PDO::PARAM_INT”,
    ’:sunrise’=>”$sunrise”
    );
    

    它将使用实际的字符串“null, PDO::PARAM_INT”。如果需要 NULL,请将占位符绑定到 PHP 值 null

    【讨论】:

      【解决方案4】:

      你必须了解字符串和 PHP 代码的区别。

      "null, PDO::PARAM_INT" 是一个字符串。您不能将 PHP 代码存储在字符串中。

      "null"AGAIN 也不是 NULL 值,而是包含单词“null”的字符串

      如果你不想绑定一个空值,那么只需绑定 PHP NULL 值。是的,就这么简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 2015-02-10
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多