我正在使用这段代码,我没有沮丧:
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, '',` 它们都失败并抛出此错误:
致命错误:无法在/opt/中通过引用传递参数2。。。
9条答案
按热度按时间g6baxovj1#
使用时
INTEGER
列(可以是NULL
)在mysql中,pdo有一些(对我来说)意想不到的行为。如果你使用
$stmt->execute(Array)
,则必须指定文字NULL
不能给予NULL
通过变量引用。所以这行不通:但这是可行的:
在mysql 5.5.15和php5.4.1上尝试了这个
h22fl7wq2#
基于其他答案,但更清楚地了解如何实际使用此解决方案。
例如,如果时间值为空字符串,但要将其保存为空:
请注意,对于时间值,可以使用param_str,因为时间存储为字符串。
sq1bmfud3#
我只是在学习pdo,但我认为你需要使用
bindValue
,不是bindParam
bindParam
引用变量,并且在调用时不引入值bindParam
. 我在php文档的评论中发现了这一点:编辑:请注意,你可能很想这么做
bindValue(':param', null, PDO::PARAM_NULL);
但它并不是对所有人都有效(感谢will shaver的报道)rjzwgtxy4#
使用时
bindParam()
必须传入变量,而不是常量。所以在这行之前,你需要创建一个变量并将其设置为null
```$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);
$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);
im9ewurl5#
对于仍有问题(无法通过引用传递参数2)的用户,请定义一个值为null的变量,而不仅仅是将null传递给pdo:
希望这有帮助。
0mkxixxg6#
试试这个。
qfe3c7zg7#
如果要插入
NULL
只有当value
是empty
或者''
,但插入value
当它可用时。a) 使用post方法接收表单数据,并使用这些值调用函数insert。
b) 计算用户是否未填写字段,并插入
NULL
如果是这样的话。例如,如果用户没有在
productName
窗体的字段$productName
将SET
但是EMPTY
. 所以,你需要检查一下empty()
,如果是,则插入NULL
.在php 5.5.17上测试
祝你好运,
fjnneemd8#
在我的情况下,我使用:
sqlite公司,
用占位符准备语句来处理未知数量的字段,
用户发送的ajax请求,其中所有内容都是一个字符串,没有类似
NULL
价值与我急需插入
NULL
s,因为它不违反外键约束(可接受值)。假设,现在用户用post发送:
$_POST[field1]
有价值的value1
可以是空字符串""
或者"null"
或者"NULL"
.首先我声明:
哪里
{$sColumns}
某物像什么field1, field2, ...
以及{$sValues}
是我的占位符?, ?, ...
.然后,我收集我的
$_POST
与数组中的列名相关的数据$values
并替换为NULL
学生:现在,我可以执行:
以及其他绕过外键约束的方法。
另一方面,如果空字符串更有意义,则必须检查该字段是否是外键的一部分(更复杂)。
z18hc3ub9#
我也遇到了同样的问题,我发现这个解决方案与bindparam一起工作: