[英]Using PHP/PDO to set a NULL value
我正在尝试使用PHP / PDO将一个名为“ flt_status”的MySQL(mysql-5.0.96)变量设置为默认值“ NULL”,并将其定义为INT(5)(可为空)。
在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程序员给我的任何示例。
有人可以告诉我我在做什么错吗?
在此先感谢您提供的任何帮助。
您做错了几件事。
$vs = “:ip, flt_status, sunrise”;
首先,您显然在使用智能引号而不是直引号。 代码需要直接引号。
接下来,您在ip
前面放置一个:
前缀,但是在其他两个命名参数之前错过了该前缀。 您需要一个:
在每个之前。
$match = array(
‘:ip’=>”$ip”,
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);
接下来,将null
放在带引号的字符串中。 这使其成为包含单词'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);
您的代码中有几个错误,请尝试像这样调整它:
$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
));
当你说
$match = array(
‘:ip’=>”$ip”,
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);
它将使用实际的字符串“ null,PDO :: PARAM_INT”。 如果要为NULL,则将占位符绑定到PHP值null
。
您必须了解字符串和PHP代码之间的区别。
"null, PDO::PARAM_INT"
是一个字符串。 您不能将PHP代码存储在字符串中。
"null"
AGAIN也不是NULL值,但是字符串包含单词“ null
如果要ot绑定null,则只需绑定PHP NULL value 。 是的,就这么简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.