복붙노트

PDO를 사용하여 NULL 값을 삽입하려면 어떻게해야합니까?

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, '', 모두 실패하고이 오류가 발생합니다.

해결법

  1. ==============================

    1.난 그냥 PDO를 배우는거야,하지만 당신 bindParam이 아닌 bindValue를 사용해야한다고 생각해.

    난 그냥 PDO를 배우는거야,하지만 당신 bindParam이 아닌 bindValue를 사용해야한다고 생각해.

    bindParam은 참조하기 위해 변수를 취하며 bindParam을 호출 할 때 값을 가져 오지 않습니다. 나는 php docs에 대한 코멘트에서 이것을 발견했다 :

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

    편집 : 추신 이 bindValue ( ': param', null, PDO :: PARAM_NULL); 그러나 그것은 모두를 위해 작동하지 못했습니다 (보고 해 주신 Will Shaver에게 감사드립니다.)

  2. ==============================

    2.bindParam ()을 사용할 때 상수가 아닌 변수를 전달해야합니다. 그래서 그 라인 앞에 변수를 만들고 그것을 null로 설정해야합니다.

    bindParam ()을 사용할 때 상수가 아닌 변수를 전달해야합니다. 그래서 그 라인 앞에 변수를 만들고 그것을 null로 설정해야합니다.

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

    시도한 경우 동일한 오류 메시지가 나타납니다.

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

    3.MySQL에서 INTEGER 컬럼 (NULL 일 수 있음)을 사용할 때, PDO는 예기치 않은 동작을합니다.

    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
    

    MySQL 5.5.15에서 PHP 5.4.1을 사용해 보았습니다.

  4. ==============================

    4.나는 같은 문제가 있었고 bindParam과 함께 작동하는이 솔루션을 발견했다.

    나는 같은 문제가 있었고 bindParam과 함께 작동하는이 솔루션을 발견했다.

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

    5.아직 문제가있는 사람들은 (참조로 매개 변수 2를 전달할 수 없음), PDO에 null을 전달하는 것뿐만 아니라 널 값을 갖는 변수를 정의하십시오.

    아직 문제가있는 사람들은 (참조로 매개 변수 2를 전달할 수 없음), PDO에 null을 전달하는 것뿐만 아니라 널 값을 갖는 변수를 정의하십시오.

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

    희망이 도움이됩니다.

  6. ==============================

    6.값이 비어 있거나 ''인 경우에만 NULL을 삽입하고 사용 가능한 경우에는 값을 삽입하십시오.

    값이 비어 있거나 ''인 경우에만 NULL을 삽입하고 사용 가능한 경우에는 값을 삽입하십시오.

    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이면 NULL을 삽입하십시오.

    PHP 5.5.17에서 테스트 됨

    행운을 빕니다,

  7. ==============================

    7.이 시도.

    이 시도.

    $stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null
    
  8. from https://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo by cc-by-sa and MIT license