2010-05-11 103 views
0

我在将数组插入sql数据库时遇到了一些问题。PHP |插入数组时出现SQL语法错误

我的错误如下:

Unable to add : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '06:45:23,i want to leave a comment)' at line 1 

我查询的var_dump是:

string(136) "INSERT INTO news_comments (news_id,comment_by,comment_date,comment) VALUES (17263,Philip,2010-05-11 06:45:23,i want to leave a comment)" 

我的问题是我怎么能一个空值添加到ID,因为它是主键,而不是news_id

我插入功能如下:

function insertQuery($tbl, &$data) 
    { 
     global $mysqli; 
     $_SESSION['errors'] = array(); 
     require_once '../config/mysqli.php'; 
     $query = "INSERT INTO $tbl (".implode(',',array_keys($data)).") VALUES (".implode(',',array_values($data)).")"; 
     var_dump($query); 
     if($result = mysqli_query($mysqli, $query)) 
     { 
     //$id = mysqli_insert_id($mysqli); 
     print 'Very well done sir!'; 
     } 
     else 
     { 
      array_push($_SESSION['errors'], 'Unable to add : ' . mysqli_error($mysqli)); 
     } 
    } 

注意:数组不是我的强项,所以我可能正确使用它们!

回答

1

您在这里正确使用数组,即使以奇怪的方式。你的主要问题是,你是如何做的,你打破查询:

INSERT INTO news_comments (news_id,comment_by,comment_date,comment) VALUES (17263,Philip,2010-05-11 06:45:23,i want to leave a comment) 

字符串值应该被引用,因为这样的:

INSERT INTO news_comments (news_id,comment_by,comment_date,comment) VALUES (17263,'Philip','2010-05-11 06:45:23','i want to leave a comment') 

从技术上讲,如果你把引号包围你的数字也是一样,因为MySQL会根据需要将它们转换为数字。所以,你的代码应该是更多这样的:

$query = "INSERT INTO $tbl (".implode(',',array_keys($data)).") VALUES ('".implode("','",array_values($data))."')"; 

注意额外的'报价在第二array_implode。这将使用单引号包装每个值,允许在数据库中使用它。

但是,请注意,如果任何值包含',则会中断。你需要逃避这些,通常使用双倍,将其转化为''。如果您使用mysql_escape_string,它会为您处理所有这些问题,但必须针对每个单独的值完成。

2

值(如果不是数字)必须放在引号之间。 通过数组并将值放入引号中,然后您可以像在代码段中那样对它进行内插。

4

你需要用单引号包装数据'yyyy-mm-dd hh:mm:ss'(你需要将它们应用到所有的文本字段(date,varchar,char,text等),并且确保正确地转义任何可能是部分的单引号文字

+0

+1对于提及转义报价 – Simon 2010-05-11 18:27:15

1

的。你需要一个"角落找寻串我要发表评论评论

试试这个

$query = "INSERT INTO $tbl (".implode(',',array_keys($data)).") VALUES (\"".implode('","',array_values($data))."\")"; 
+0

很好的反馈球员, 我现在觉得很傻,但是我猜想当你被如此沉重地包裹在一些容易错过的东西里面时,你会很在意。 – Philip 2010-05-11 18:32:24

0

我认为你缺少引号(')周围的字符串值,例如值应该是这样的:

17263,'Philip','2010-05-11 06:45:23','i want to leave a comment' 

注:不要忘记使用mysql_real_escape_string函数的字符串值。