如何使用pdo插入空值?

xsuvu9jc  于 2021-06-15  发布在  Mysql
关注(0)|答案(9)|浏览(312)

我正在使用这段代码,我没有沮丧:

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。。。
g6baxovj

g6baxovj1#

使用时 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

在mysql 5.5.15和php5.4.1上尝试了这个

h22fl7wq

h22fl7wq2#

基于其他答案,但更清楚地了解如何实际使用此解决方案。
例如,如果时间值为空字符串,但要将其保存为空:

if($endtime == ""){
    $db->bind(":endtime",$endtime=NULL,PDO::PARAM_STR);
  }else{
    $db->bind("endtime",$endtime);
  }

请注意,对于时间值,可以使用param_str,因为时间存储为字符串。

sq1bmfud

sq1bmfud3#

我只是在学习pdo,但我认为你需要使用 bindValue ,不是
bindParam bindParam 引用变量,并且在调用时不引入值 bindParam . 我在php文档的评论中发现了这一点:

bindValue(':param', null, PDO::PARAM_INT);

编辑:请注意,你可能很想这么做 bindValue(':param', null, PDO::PARAM_NULL); 但它并不是对所有人都有效(感谢will shaver的报道)

rjzwgtxy

rjzwgtxy4#

使用时 bindParam() 必须传入变量,而不是常量。所以在这行之前,你需要创建一个变量并将其设置为 null ```
$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);

如果尝试以下操作,则会收到相同的错误消息:

$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);

im9ewurl

im9ewurl5#

对于仍有问题(无法通过引用传递参数2)的用户,请定义一个值为null的变量,而不仅仅是将null传递给pdo:

bindValue(':param', $n = null, PDO::PARAM_INT);

希望这有帮助。

0mkxixxg

0mkxixxg6#

试试这个。

$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null
qfe3c7zg

qfe3c7zg7#

如果要插入 NULL 只有当 valueempty 或者 '' ,但插入 value 当它可用时。
a) 使用post方法接收表单数据,并使用这些值调用函数insert。

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 窗体的字段 $productNameSET 但是 EMPTY . 所以,你需要检查一下 empty() ,如果是,则插入 NULL .
在php 5.5.17上测试
祝你好运,

fjnneemd

fjnneemd8#

在我的情况下,我使用:
sqlite公司,
用占位符准备语句来处理未知数量的字段,
用户发送的ajax请求,其中所有内容都是一个字符串,没有类似 NULL 价值与
我急需插入 NULL s,因为它不违反外键约束(可接受值)。
假设,现在用户用post发送: $_POST[field1] 有价值的 value1 可以是空字符串 "" 或者 "null" 或者 "NULL" .
首先我声明:

$stmt = $this->dbh->prepare("INSERT INTO $table ({$sColumns}) VALUES ({$sValues})");

哪里 {$sColumns} 某物像什么 field1, field2, ... 以及 {$sValues} 是我的占位符 ?, ?, ... .
然后,我收集我的 $_POST 与数组中的列名相关的数据 $values 并替换为 NULL 学生:

for($i = 0; $i < \count($values); $i++)
     if((\strtolower($values[$i]) == 'null') || ($values[$i] == ''))
        $values[$i] = null;

现在,我可以执行:

$stmt->execute($values);

以及其他绕过外键约束的方法。
另一方面,如果空字符串更有意义,则必须检查该字段是否是外键的一部分(更复杂)。

z18hc3ub

z18hc3ub9#

我也遇到了同样的问题,我发现这个解决方案与bindparam一起工作:

bindParam(':param', $myvar = NULL, PDO::PARAM_INT);

相关问题