我在php上有一个变量,它有时可能是// EventServiceProvider.php
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'WISSIT\UserService\Events\UserCreated' => [
'WISSIT\UserService\Listeners\UserCreatedEmail'
]
];
}
,我想将此变量插入到我的数据库中。但问题是,PHP的空值不会作为空值插入db。
我的db列允许空值。
NULL
答案 0 :(得分:2)
(不是您实际问题的答案,但可能是您的问题。您的双引号字符串中variable substitution的“即时”问题已得到解答here)
由于您已经在使用prepare,因此您只需将其设为参数化语句
即可$insert = $db->prepare('insert into mytable set mycolumn=?' );
$insert->execute( array($variable) );
和$ variable === NULL将导致MySQL表中的NULL值。
e.g。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
setup($pdo);
$stmt = $pdo->prepare('INSERT INTO soFoo SET mycolumn=?');
$variable = 1; $stmt->execute( array($variable) );
$variable = NULL; $stmt->execute( array($variable) );
$variable = 2; $stmt->execute( array($variable) );
foreach( $pdo->query('SELECT id,mycolumn FROM soFoo', PDO::FETCH_ASSOC) as $row) {
var_export($row);
}
function setup($pdo) {
$pdo->exec('
CREATE TEMPORARY TABLE soFoo (
id int auto_increment,
mycolumn int,
primary key(id)
)
');
}
打印
array (
'id' => 1,
'mycolumn' => 1,
)array (
'id' => 2,
'mycolumn' => NULL,
)array (
'id' => 3,
'mycolumn' => 2,
)
答案 1 :(得分:1)
这是因为PHP null
被转换为空字符串&#34;&#34;在创建查询字符串时。
$variable = null;
$insert = "insert into mytable set mycolumn = $variable" ;
echo $insert;
将产生:
insert into mytable set mycolumn =
要修复查询,您需要检查PHP变量是否为null并将其更改为字符串NULL。 (现在也在@MarkB的评论中提到过。)
if ($variable == null){
$variable = "NULL";
}
这将产生:
"insert into mytable set mycolumn = NULL"
请注意,NULL没有&#34;它周围,因为它现在连接到另一个字符串。
*(注意:insert into tablename set ..
不正确,您需要insert
数据或update tablename set
数据。)