PHP mysqli - 更新枚举字段的值会导致空字符串,但在PHPMyAdmin中运行时,同样的查询会起作用

时间:2015-08-17 16:44:28

标签: php mysqli enums

查询:

UPDATE caption_queue SET status = 'Conversion Completed' WHERE tpi_id = '3130'

如标题中所述,当我在PHP中运行它时,该值设置为空字符串。但是,当在MySQL中直接运行完全相同的查询时,它可以正常工作。

除此之外,我只在单个枚举值上获得此行为:'转换已完成'。当使用其他值(大多数也包含空格)进行更新时,没有问题。

感兴趣的人的实际PHP代码:

$sql = "UPDATE caption_queue SET status = 'Conversion Completed' WHERE tpi_id = '$tpi_id'";
$val = mysqli_query($link, $sql);
//$link comes from somewhere else, but we use it extensively throughout our website

表格定义:

CREATE TABLE IF NOT EXISTS `caption_queue` (
`tpi_id` int(11) NOT NULL,
`pid` int(6) DEFAULT NULL,
`conversion_began` datetime DEFAULT NULL,
`yt_caption_id` varchar(50) DEFAULT NULL,
`yt_video_id` varchar(50) DEFAULT NULL,
`status` enum('Pending Conversion','Converting','Conversion Completed','Pending Upload','Video Processing','Video Processed','Uploading Transcription','Caption Syncing','Caption Synced','Caption Downloading','Caption Ready') DEFAULT 'Pending Conversion'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3 个答案:

答案 0 :(得分:0)

感谢。

我认为如果你将名为status的列放在后面的滴答声中,你会发现它应该有效。

$query="UPDATE caption_queue SET `status` = 'Conversion Completed' WHERE tpi_id = '3130'";

答案 1 :(得分:0)

我找到了解决方法。通过使用严格模式:

SET SESSION sql_mode = 'STRICT_ALL_TABLES'

我能够毫无问题地更新字段。看起来像mysqli的某种问题。

答案 2 :(得分:0)

如果您使用的是MySQLI,并且您的数据库有枚举,则需要查找值的位置以更新数据库,因为它不接受新字符串!

这是我的数据库配置列的示例!

status  enum('active', 'inactive', 'banned')

如果要更新这些值,请将这些值转换为数字,例如active = 1,inactive = 2,banned = 3

通过PHP我们可以执行以下操作

$query = 'UPDATE '.$this->table.' SET status = :status' 
$stmt = $this->conn->prepare($query);
if($this->status == 'active') 
    {
      $finalStatus = 1;
    }

    if($this->status == 'inactive') 
    {
      $finalStatus = 2;
    }

    if($this->status == 'banned') 
    {
      $finalStatus = 3;
    }
$stmt->bindParam(':status', $finalStatus);
$stmt->execute();

这将节省您的一天!

此代码用作示例,以提供针对此问题的完整解决方案!