PHP的空值是否等于MySQL的空值?

时间:2015-11-19 16:31:56

标签: php mysql

我在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

2 个答案:

答案 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数据。)