2013-02-01 96 views
0

许多类似于我的帖子,他们都没有工作。PHP数组插入MySQL失败

有一个数组$data['date'], $data['name'], $data['value']

试图插入MySQL表MyValues(日期,名称,值)

试过7-8不同的方法,没有工作。 想类似

for ($a=0;$a<10;$a++) { 
    mysql_query("INSERT INTO MyValues('Date','Index_Name','Index') 
     VALUES ($data['date'][$a] ,$data['name'][$a], $data['value'][$a])" 
} 

也有尝试过的foreach,构建一个字符串给到MySQL等

得到这个错误 警告:mysql_error()预计参数1是资源,鉴于布尔在线45

+2

[**在新的代码,请不要使用'mysql_ *'功能**](HTTP: //bit.ly/phpmsql)。他们不再被维护[并被正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果您选择PDO, [这里是一个很好的教程](http://stackoverflow.com/a/14110189/1723893)。 –

+0

你会得到什么错误? – j08691

+0

有一个名为Values的表真的合法吗? – span

回答

0

由于Values是一个保留字,因为是表名,你不能使用它。您必须使用反引号将其括起来。同样,使用单引号来命名列是无效的,您也需要反引号。

试试这个:

$out = Array(); 
$esc = "mysql_real_escape_string"; 
foreach($data['date'] as $k=>$v) { 
    $out[] = "('".$esc($data['date'][$k])."', '".$esc($data['name'][$k])."', " 
     ."'".$esc($data['value'][$k])."')"; 
} 
mysql_query("INSERT INTO `Values` (`Date`, `Index_Name`, `Index`) values ".implode(",",$out)); 
+0

编辑我的回答 –

+0

我想你刚才已经证明了为什么使用'mysql_query'是一个非常糟糕的主意。虽然聪明,但这是一个巨大的混乱。 – tadman

+1

Thanx Kolink。这工作。 – user2033337

-1

首先,只需使用PDO/mysqli与准备语句,所以你不会有这样的问题。

这将解决这个问题,但(列名与后台蜱,而不是单引号和转义的数据):

for ($a=0;$a<10;$a++) { 
    mysql_query("INSERT INTO `Values` (`Date`,`Index_Name`,`Index`) 
     VALUES ('".mysql_real_escape_string($data['date'][$a])."' , 
'".mysql_real_escape_string($data['name'][$a])."', 
'".mysql_real_escape_string($data['value'])[$a]."'"); 
} 

,并尽量避免为你列像indexvalues保留名称。

+0

我的回答有什么问题? –

3

columnName不应该用单引号包装,因为它们是标识符而不是字符串文字。

INSERT INTO `Values` (Date,Index_Name,Index) VALUES (....) 

一两件事,在这里,需要将包装与反引号唯一的标识符是表名VALUES,因为它是一个保留关键字。

作为旁注,查询是用SQL Injection脆弱,如果变量的值(小号)从外部来了。请看下面的文章,了解如何防止它。通过使用PreparedStatements你可以摆脱使用单引号围绕值。

+1

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获取在第1行'值(日期,索引名称,索引)VALUES'附近使用的正确语法 –

+1

^已解决问题。 Downvote删除。 –

+0

@Kolink我忽略了它。谢谢 –

-1

首先,我相信你想你的查询值引用,所以结果是“价值”,而不仅仅是价值。例如:

mysql_query("INSERT INTO Values(Date,Index_Name,Index) VALUES ('$data['date'][$a]' ,'$data['name'][$a]', '$data['value'][$a]'); 

如果你正在做多个查询,这样做:

$q = "INSERT INTO Values(Date,Index_Name,Index) VALUES "; 
for { 
    // Add to the string here for each insert item 
} 
mysql_query($q); 

此外,请开始逐步淘汰PHP的mysql_ *图书馆赞成的mysqli或PDO的。

+0

我刚才意识到你把值的表名称。你为什么要命名一个表值?据我所知,这是MySql中的一个保留字。如果一切都失败,请尝试更改表的名称。 –

+0

你为什么不投票给大家?当然,我们可能不会在银盘上递交代码,但请至少说明为什么我们拒绝了投票,所以我们可以尝试解决它们... –

+0

抱歉,noob。击中错误的按钮 - >投票。不是故意的!对不起 – user2033337

-2

这工作:

for ($a=0;$a<10;$a++) { 
    mysql_query("INSERT INTO Values('Date','Index_Name','Index') 
    VALUES ('".$data['date'][$a]."','".$data['name'][$a]."','".$data['value'][$a]."')" 
} 
+0

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获得在第1行的“值(日期,索引名称,索引)值”附近使用的正确语法 –

+0

这甚至不足以解决问题。为什么人们总是认为这是字符串插值问题?不是。 – tadman

0

试试这个,使用$a++$ee++

for ($a=0;$a<10;$a++) { 
mysql_query("INSERT INTO `Values` (`Date`,`Index_Name`,`Index`) 
    VALUES ('".$data['date'][$a]."' ,'".$data['name'][$a]."', '".$data['value'][$a]."' ") 
} 
+0

关闭,但*仍*错误... –