Estou usando este código e não estou frustrado:
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, '',
todos eles falham e geram este erro:
Erro fatal : não é possível passar o parâmetro 2 por referência em / opt / ...
bindValue()
overbindParam()
; por tudo, não apenas peloNULL
valor. Não consigo pensar em um único caso em que você precisaria vincular o parâmetro a uma referência de uma variável PHP - mas é isso quebindParam()
acontece.Ao usar
bindParam()
você deve passar uma variável, não uma constante. Portanto, antes dessa linha, você precisa criar uma variável e defini-la comonull
Você obteria a mesma mensagem de erro se tentasse:
fonte
Ao usar
INTEGER
colunas (que podem serNULL
) no MySQL, PDO tem algum (para mim) comportamento inesperado.Se você usar
$stmt->execute(Array)
, você deve especificar o literalNULL
e não pode fornecerNULL
por referência de variável. Portanto, isso não funcionará:Mas isso vai funcionar:
Tentei isso no MySQL 5.5.15 com PHP 5.4.1
fonte
isset()
correlaciona melhor paraNULL
. Uma string vazia também é um valor.Para quem ainda tem problemas (não é possível passar o parâmetro 2 por referência), defina uma variável com valor nulo, não apenas passe nulo para o PDO:
Espero que isto ajude.
fonte
Eu tive o mesmo problema e encontrei esta solução trabalhando com bindParam:
fonte
Se você deseja inserir
NULL
apenas quandovalue
forempty
ou''
, mas insiravalue
quando estiver disponível.A) Recebe os dados do formulário usando o método POST e chama a função insert com esses valores.
B) Avalia se um campo não foi preenchido pelo usuário e insere
NULL
se for o caso.Por exemplo, se o usuário não inserir nada no
productName
campo do formulário,$productName
seráSET
masEMPTY
. Portanto, você precisa verificar se éempty()
, e se for, insiraNULL
.Testado em PHP 5.5.17
Boa sorte,
fonte
IFNULL()
função do MySQL na string de consulta. Assim:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Experimente isso.
fonte
Com base nas outras respostas, mas com um pouco mais de clareza sobre como realmente usar essa solução.
Se, por exemplo, você tiver uma string vazia para um valor de tempo, mas quiser salvá-la como nula:
Observe que para valores de tempo você usaria PARAM_STR, pois os tempos são armazenados como strings.
fonte
No meu caso, estou usando:
SQLite,
preparou declarações com marcadores para lidar com um número desconhecido de campos,
Solicitação AJAX enviada pelo usuário onde tudo é uma string e não existe algo como
NULL
valor eEu preciso desesperadamente inserir
NULL
s, pois isso não viola as restrições de chave estrangeira (valor aceitável).Suponha que agora o usuário envie com post:
$_POST[field1]
com valorvalue1
que pode ser a string vazia""
ou"null"
ou"NULL"
.Primeiro eu faço a declaração:
onde
{$sColumns}
está tudo gostofield1, field2, ...
e{$sValues}
são meus marcadores de posição?, ?, ...
.Então, eu coleto meus
$_POST
dados relacionados aos nomes das colunas em uma matriz$values
e substituo porNULL
s:Agora posso executar:
e entre outras restrições de chave estrangeira de desvio.
Se, por outro lado, uma string vazia faz mais sentido, você deve verificar se esse campo faz parte de uma chave estrangeira ou não (mais complicado).
fonte