[php] PDO를 사용하여 NULL 값을 어떻게 삽입합니까?

이 코드를 사용하고 있으며 좌절감이 없습니다.

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를 전달할 수 없습니다.



답변

난 그냥 PDO를 배우고,하지만 난 당신이 사용할 필요가 있다고 생각 bindValue하지bindParam

bindParam참조 할 변수를 취하고을 호출 할 때 값을 가져 오지 않습니다 bindParam. 나는 이것을 PHP 문서에 대한 주석에서 발견했습니다.

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

편집 : 추신 : 당신은 이것을 bindValue(':param', null, PDO::PARAM_NULL);하고 싶을 수도 있지만 모든 사람에게 효과가 없었습니다 (보고 해 주신 Will Shaver에게 감사드립니다.)


답변

사용할 때 bindParam()상수가 아닌 변수를 전달해야합니다. 따라서 해당 줄 전에 변수를 만들고 다음으로 설정해야합니다.null

$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);

시도한 경우 동일한 오류 메시지가 표시됩니다.

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


답변

MySQL에서 INTEGER열 (일 수 있음 NULL) 을 사용할 때 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를 전달할 수 없음) PDO에 null을 전달하는 것이 아니라 null 값으로 변수를 정의하십시오.

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