This actually works to bind NULL on an integer field in MySQL :
$stm->bindValue(':param', null, PDO::PARAM_INT);
PDOStatement->bindValue
(PHP 5 >= 5.1.0, PECL pdo >= 1.0.0)
PDOStatement->bindValue — Associe une valeur à un paramètre
Description
Associe une valeur à un nom correspondant ou à un point d'interrogation (comme paramètre fictif) dans la requête SQL qui fut utilisée pour préparer la requête.
Liste de paramètres
- parameter
-
Identifiant du paramètre. Pour une requête préparée utilisant les marqueurs, cela sera un nom de paramètre de la forme :nom. Pour une requête préparée utilisant les points d'interrogation (comme paramètre fictif), cela sera un tableau indexé numériquement qui commence à la position 1 du paramètre.
- value
-
La valeur à associer au paramètre.
- data_type
-
Type de données explicite pour le paramètre utilisant les constantes PDO::PARAM_*. Par défaut, vaut PDO::PARAM_STR.
Valeurs de retour
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemples
Exemple #1 Exécute une requête préparée avec des marqueurs nommés
<?php
/* Exécute une requête préparée en associant des variables PHP */
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
FROM fruit
WHERE calories < :calories AND couleur = :couleur');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':couleur', $couleur, PDO::PARAM_STR);
$sth->execute();
?>
Exemple #2 Exécute une requête préparée avec des points d'interrogation comme paramètre fictif
<?php
/* Exécute une requête préparée en associant des variables PHP */
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
FROM fruit
WHERE calories < ? AND couleur = ?');
$sth->bindValue(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $couleur, PDO::PARAM_STR);
$sth->execute();
?>
Voir aussi
- PDO::prepare() - Prépare une requête à l'exécution et retourne un objet
- PDOStatement::execute() - Exécute une requête préparée
- PDOStatement::bindParam() - Lie un paramètre à un nom de variable spécifique
PDOStatement->bindValue
04-Sep-2009 03:06
01-May-2009 12:19
If you want to bind a null value to a database field you must use 'NULL' in quotes (for MySQL):
<?php
$stmt->bindValue(:fieldName, 'NULL');
// not
$stmt->bindValue(:fieldName, NULL);
// or
$stmt->bindValue(:fieldName, null);
?>
Using PHP's null/NULL as a value doesn't work.
11-Feb-2009 07:54
I've slightly altered the PDOBindArray function above so it can receive data types, which will help against injection attacks.
<?php
private function PDOBindArray(&$poStatement, &$paArray){
foreach ($paArray as $k=>$v) {
@$poStatement->bindValue($k, $v[0], $v[1]);
}
}
// the array structure should now look something like this
$inputArray = array(
':email' => array($email, PDO::PARAM_STR),
':pass' => array($pass, PDO::PARAM_INT)
);
?>
25-Aug-2008 11:31
PDO lacks methods to check if values can be bound to a parameter, e.g.,
if ($statement->hasParameter(':param'))
{
$statement->bindValue(':param', $value);
}
ATM you *have to know* which parameters exist in the SQL-statement. Otherwise you get an error. You cannot test for them.
08-Jan-2008 10:20
What the bindValue() docs fail to explain without reading them _very_ carefully is that bindParam() is passed to PDO byref - whereas bindValue() isn't.
Thus with bindValue() you can do something like $stmt->bindValue(":something", "bind this"); whereas with bindParam() it will fail because you can't pass a string by reference, for example.
01-Oct-2007 01:46
note that bindParam() doesn't let you bind a table name into a prepared statement, whereas this can be done with bindValue()...
15-Dec-2006 02:34
For bind whole array at once
<?php
function PDOBindArray(&$poStatement, &$paArray){
foreach ($paArray as $k=>$v){
@$poStatement->bindValue(':'.$k,$v);
} // foreach
} // function
// example
$stmt = $dbh->prepare("INSERT INTO tExample (id,value) VALUES (:id,:value)");
$taValues = array(
'id' => '1',
'value' => '2'
); // array
PDOBindArray($stmt,$taValues);
$stmt->execute();
?>
26-May-2006 10:43
I'm not sure if this is intentional or not, but you can't use a placeholder more than once. I assumed (wrongly) that bindValue() would replace ALL instances of a given placeholder with a value. For example:
<?php
// $db is a PDO object
$stmt = $db->prepare
('
insert into
TableA
(
ID,
Name,
Foo
)
select
null,
:Name,
:Foo
from
TableA
where
Foo = :Foo
');
$stmt->bindValue(':Name', 'john doe');
$stmt->bindValue(':Foo', 'foo');
$stmt->execute();
?>
This apparently won't work - you must have separate :SelectFoo and :WhereFoo. I'm using PHP 5.0.4, MySQL 5.0.14, and PDO version 1.0.2.
