mysql插入问题

时间:2010-01-05 16:27:27

标签: php sql mysql mysqli

我有一个非常奇怪的问题。我不知道为什么它不起作用。我创建一个用户并获取id并在另一个表中基于该id插入一行。使用该id插入行,但是不插入该行的其他值!

 $user_id = mysqli_insert_id($this->connection);

 $query = "INSERT INTO selections 
 (user_id, language_id, country_id, region_id, city_id, gender_id, age_id, category_id)
 VALUES ($user_id, 1, 1, 0, 0, 0, 20, 0)";

所以user_id被插入,而不是其他值(它们在表中都是0)。我确实检查了列并删除了所有外键来调试此问题。但我完全没有任何线索。

列都是INT。奇怪的部分是有时我用一个字面数字替换$ user_id它有效,有时候它没有。但总是创建行。我检查过$ user_id是一个整数。

我知道这是一个难题,它可能是由许多事情引起的,但我现在试图解决这个小问题3个小时。如果有人给我一些我可以做的事来调试这个问题,那就太棒了。

更新:即使我设置了默认值并只插入第一列(user_id),它也不起作用。其他所有领域都是0.太奇怪了!

| selections | CREATE TABLE `selections` (
  `user_id` int(11) NOT NULL,
  `language_id` int(11) NOT NULL DEFAULT '1',
  `country_id` int(11) NOT NULL DEFAULT '1',
  `region_id` int(11) NOT NULL DEFAULT '0',
  `city_id` int(11) NOT NULL DEFAULT '0',
  `gender_id` int(11) NOT NULL DEFAULT '0',
  `age_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |


  $query = "INSERT INTO selections
        (user_id)
        VALUES ('$user_id')";

user_id显示178,其他字段为0 :(

UPDATE:

它在sql命令行中有效。但不是在PHP。但mysqli没有产生错误,确实插入了行,但为什么其他字段为0?

答案:我的错。我有一个jquery脚本,将其更改回0 0 0 0 0 0 0.我的页面上有很多AJAX,所以找到它很棘手...对不起我的坏!

2 个答案:

答案 0 :(得分:4)

遇到这种情况时,请在执行之前将查询打印到屏幕:

$query = "INSERT INTO ...";
echo $query

尝试:

$query = "INSERT INTO selections 
            (user_id, language_id, country_id, region_id, city_id, gender_id, age_id, category_id)
          VALUES 
            ({$user_id}, 1, 1, 0, 0, 0, 20, 0)";

在SQL字符串语句中引用PHP变量时,需要将它们包装在{}中。

使用您的DEFAULT约束


如果您有默认值,则无需在INSERT语句中设置值:

INSERT INTO selections 
  (user_id)
VALUES 
  ({$user_id})

参考完整性


您正在获取最后插入的ID并在后续插入另一个表中使用它,但您没有在user_id列上定义外键以确保实际进入该列的值存在于另一个表中。如果您提供表格的名称和您获取上一个插入ID的列,我将提供ALTER TABLE statement

答案 1 :(得分:1)

$query = "INSERT INTO selections 
(user_id, language_id, country_id, region_id, city_id, gender_id, age_id, category_id)
VALUES ('$user_id', 1, 1, 0, 0, 0, 20, 0)";

$ user_id周围的单引号可能会这样做。