2010-05-12 168 views
1

我正在学习PHP,我试图将数据插入名为“pumpl2”的MySQL数据库。表设置为这样。初学PHP:我无法将数据插入MYSQL数据库

create table product 
(productid int unsigned not null auto_increment primary key, 
    price int(9) not null, 
    value int(9) not null, 
    description text 
); 

我有一个表格,并希望从数据库表格中插入的字段。这是php文件的样子。

<?php 

// create short variable names 
$price = $_POST['price']; 
$value = $_POST['value']; 
$description = $_POST['description']; 

if (!$price || !$value || !$description) { 
echo "You have not entered all the required details.<br />" 
    ."Please go back and try again."; 
exit; 
} 

@ $db = new mysqli('localhost', 'pumpl', '********', 'pumpl2'); 

if (mysqli_connect_errno()) { 
echo "Error: Could not connect to database. Please try again later."; 
exit; 
} 

$query = "insert into pumpl2 values 
('".$price."', '".$value."', '".$description."')"; 
$result = $db->query($query); 

if ($result) { 
echo $db->affected_rows." product inserted into database."; 
} else { 
echo "An error has occurred. The item was not added."; 
} 

$db->close(); 

?> 

当我提交表单时,出现错误信息“发生错误,未添加项目”。

有谁知道问题是什么?谢谢!

+2

您串联原始值后进入一个INSERT语句这是一个非常糟糕的主意。您应该查看PDO并准备好声明:http://www.php.net/manual/en/pdo.prepare.php – 2010-05-12 10:36:29

+0

我现在将查看它。谢谢! – Victor 2010-05-12 10:47:01

+0

@Colonel实际上,PDO对参数化查询没有垄断权。 mysqli有类似的机制。 – 2010-05-12 11:11:59

回答

3

您只插入三列,但在表格中定义了四列。因此,你必须明确地命名列:

INSERT INTO tableName (ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'C') 
4

这应该给你更多的信息:

echo "An error has occurred: " . $db->error(); 
+1

+1告诉OP如何自己诊断问题! – symcbean 2010-05-12 10:39:32

+0

谢谢。我将此添加到脚本中。我相信它会在未来有所帮助。 – Victor 2010-05-12 10:46:43

+1

@Victor,实际上,这是错误的方法。应该使用trigger_error()而不是echo。并添加一个查询本身的错误消息也是一个好主意。 – 2010-05-12 11:09:36

3

您试图插入到表名为pumpl2,但CREATE TABLE语句创建一个表名为product

此外,ZeissS noted,你必须要考虑以下几点:

CREATE TABLE product ( 
    productid int unsigned not null auto_increment primary key, 
    price int(9) not null, 
    value int(9) not null, 
    description text 
); 
Query OK, 0 rows affected (0.09 sec) 

INSERT INTO product VALUES (1, 1, 'test'); 
ERROR 1136 (21S01): Column count doesn't match value count at row 1 

为了解决这个错误,你需要明确指定列的列表:

INSERT INTO product (price, value, description) VALUES (1, 1, 'test'); 
Query OK, 1 row affected (0.03 sec) 
+0

谢谢。我相信这是正确的。我将这些建议与上面的建议结合起来,它帮助我解决了这个问题。 – Victor 2010-05-12 10:41:02

+0

不,你不应该在这里插入NULL,因为列被定义为'not null'和'auto_increment'。我会说,在这里使用NULL是依赖于底层数据库太多。说清楚(其他人不会被null值弄糊涂)并且简单:不要插入此列。 – ZeissS 2010-05-12 10:47:30

+0

@ZeissS:好点。固定。 (实际上,它不会在严格模式下工作。) – 2010-05-12 11:10:12

0

这可能是几个原因。

尝试

echo "Errormessage: ".$db->error; 

欲了解详细内容,为什么插入没有工作。

1

你的查询是错误的,你没有指定的列。 与尝试:

"INSERT INTO pumpl2 (price, value, description) VALUES ('".$price."', '".$value."', '".$description."')" 

除此之外,不使用$ _POST值直接输入到数据库中。在这一个上搜索SQL注入。首先在$ _POST数据上使用mysql_real_escape_string,或者甚至更好地使用预准备语句。

+0

如果要为每列插入一个值,并且按正确顺序,则不需要指定值。但是,它*是指定它们的良好惯例。编辑:啊对,OP没有插入到所有列。 – DisgruntledGoat 2010-05-12 10:41:12

0

您的表格被称为products而不是pumpl2。此外,你应该做的:

insert into product (price, value, description) values (... 
2
$query = "insert into pumpl2.product (price, value, description) values('" . 
     $db->read_escape_string($price) . "', '". 
     $db->read_escape_string($value) . "', '" . 
     $db->read_escape_string($description) . "')"; 
$result = $db->query($query); 

而且强制性XKCD卡通: