111

私はこのコードを使用していますが、欲求不満を超えています:

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 を渡すことはできません

4

9 に答える 9

144

bindValueではなく、を使用する必要がありますbindParam

bindParam参照によって変数を受け取り、呼び出し時に値を取得しませんbindParam。PHPドキュメントのコメントでこれを見つけました:

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

PS あなたはこれをやりたくなるかもしれませんbindValue(':param', null, PDO::PARAM_NULL);が、すべての人にうまくいくわけではありません (報告してくれた Will Shaver に感謝します)。

于 2009-09-08T03:23:52.733 に答える
49

使用するときbindParam()は、定数ではなく変数を渡す必要があります。したがって、その行の前に、変数を作成して設定する必要がありますnull

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

次のことを試みた場合、同じエラー メッセージが表示されます。

$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);
于 2009-09-08T03:21:58.643 に答える
28

When using INTEGER columns (that can be NULL) in MySQL, PDO has some (to me) unexpected behaviour.

If you use $stmt->execute(Array), you have to specify the literal NULL and cannot give NULL by variable reference. So this won't work:

// $val is sometimes null, but sometimes an integer
$stmt->execute(array(
    ':param' => $val
));
// will cause the error 'incorrect integer value' when $val == null

But this will work:

// $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

Tried this on MySQL 5.5.15 with PHP 5.4.1

于 2012-12-23T13:17:32.163 に答える
3

がまたは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フォームのフィールドに何も入力しない場合、 but$productNameになります。したがって、それがであるかどうかを確認し、そうである場合は を挿入する必要があります。SETEMPTYempty()NULL

PHP 5.5.17 でテスト済み

幸運を、

于 2014-10-18T01:28:36.553 に答える