我怎么插入空值使用公设辩护?
-
21-09-2019 - |
题
我使用这个代码和我超越沮丧:
try {
$dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem
PDO::PARAM_NULL, null, '',
他们都会失败,并把这个错误:
致命的错误:不能通过参2通过引/opt/...
解决方案
我刚开始学习PDO,但我认为你需要使用bindValue
,不bindParam
bindParam
采用可变,来参考,并且在值在主叫bindParam
时不拉。我发现这个在PHP的文档的注释:
bindValue(':param', null, PDO::PARAM_INT);
编辑:P.S.你可能会想这样做bindValue(':param', null, PDO::PARAM_NULL);
但它没有对每个人的工作(谢谢你会剃须刀报告。)
其他提示
当使用bindParam()
你必须通过在一个变量,而不是一个常数。因此,该行之前,你需要创建一个变量并将其设置为null
$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);
您会,如果你试图得到同样的错误消息:
$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);
当使用INTEGER
列(可为可NULL
)在MySQL,PDO有一些(我)意外行为。
如果您使用$stmt->execute(Array)
,必须指定字面NULL
并且不能由可变基准给予NULL
。
所以这是行不通的:
// $val is sometimes null, but sometimes an integer
$stmt->execute(array(
':param' => $val
));
// will cause the error 'incorrect integer value' when $val == null
但是,这将工作:
// $val again is sometimes null, but sometimes an integer
$stmt->execute(array(
':param' => isset($val) ? $val : null
));
// no errors, inserts NULL when $val == null, inserts the integer otherwise
用PHP 5.4.1试过这在MySQL 5.5.15
对于那些谁仍然有问题(不能传参数2通过引用),定义与空值的变量,而不是仅仅传递null到PDO:
bindValue(':param', $n = null, PDO::PARAM_INT);
希望这有助于。
我有同样的问题,我发现这个溶液与bindParam工作:
bindParam(':param', $myvar = NULL, PDO::PARAM_INT);
如果要插入NULL
只有当value
是empty
或''
,但插入value
可用时。
A)接收使用POST方法的形式的数据,并用这些值调用函数的插入。
insert( $_POST['productId'], // Will be set to NULL if empty
$_POST['productName'] ); // Will be to NULL if empty
B)评估板如果字段不是由用户填充,并插入NULL
如果是这样的话。
public function insert( $productId, $productName )
{
$sql = "INSERT INTO products ( productId, productName )
VALUES ( :productId, :productName )";
//IMPORTANT: Repace $db with your PDO instance
$query = $db->prepare($sql);
//Works with INT, FLOAT, ETC.
$query->bindValue(':productId', !empty($productId) ? $productId : NULL, PDO::PARAM_INT);
//Works with strings.
$query->bindValue(':productName',!empty($productName) ? $productName : NULL, PDO::PARAM_STR);
$query->execute();
}
举例来说,如果用户确实上的形式的productName
字段不输入任何东西,然后$productName
将SET
但EMPTY
。所以,你需要检查它是否是empty()
,如果是,那么插入NULL
。
测试在PHP 5.5.17
好运,
尝试。
$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null
在我的情况下,我是使用:
源码,
准备好的发言与占位,以处理数量不明的领域,
阿贾克斯发送的请求用户在哪里 的一切 就是一串没有这样的事情一样
NULL
值和我迫切需要插入
NULL
s为,这并不违反 外键制约了 (可接受的价值)。
假设现在的用户发送的与员额: $_POST[field1]
有价值 value1
这可以是空字符串 ""
或 "null"
或 "NULL"
.
第一我做的声明:
$stmt = $this->dbh->prepare("INSERT INTO $table ({$sColumns}) VALUES ({$sValues})");
哪里 {$sColumns}
是sth喜欢 field1, field2, ...
和 {$sValues}
是我占位 ?, ?, ...
.
然后,我收我的 $_POST
有关的数据的列名字在列 $values
和 替换 NULL
s:
for($i = 0; $i < \count($values); $i++)
if((\strtolower($values[$i]) == 'null') || ($values[$i] == ''))
$values[$i] = null;
现在,我可以执行:
$stmt->execute($values);
和除其他绕过外键的约束。
如果在另一方面,一个空串并使得更有意义,那么你必须要检查这一领域的一部分外键或不是(更复杂的).