我使用这个代码和我超越沮丧:

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只有当valueempty'',但插入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字段不输入任何东西,然后$productNameSETEMPTY。所以,你需要检查它是否是empty(),如果是,那么插入NULL

测试在PHP 5.5.17

好运,

尝试。

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

在我的情况下,我是使用:

  • 源码,

  • 准备好的发言与占位,以处理数量不明的领域,

  • 阿贾克斯发送的请求用户在哪里 的一切 就是一串没有这样的事情一样 NULL 值和

  • 我迫切需要插入 NULLs为,这并不违反 外键制约了 (可接受的价值)。

假设现在的用户发送的与员额: $_POST[field1] 有价值 value1 这可以是空字符串 """null""NULL".

第一我做的声明:

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

哪里 {$sColumns} 是sth喜欢 field1, field2, ...{$sValues} 是我占位 ?, ?, ....

然后,我收我的 $_POST 有关的数据的列名字在列 $values 替换 NULLs:

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

现在,我可以执行:

$stmt->execute($values);

和除其他绕过外键的约束。

如果在另一方面,一个空串并使得更有意义,那么你必须要检查这一领域的一部分外键或不是(更复杂的).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top