有人可以告诉我这个查询有什么问题吗?
$sql = "INSERT INTO vendors (business_name, address, description, contact_name,
contact_phone, alt_phone, url, level, use_me)
VALUES($_POST['business_name'],
$_POST['address'],
$_POST['description'],
$_POST['contact_name'],
$_POST['contact_phone'],
$_POST['alt_phone'],
$_POST['url'],
$_POST['level'],
$_POST['use_me'])";
当尝试执行时,我收到错误: 解析错误:语法错误,意外T_ENCAPSED_AND_WHITESPACE,期待T_STRING或T_VARIABLE或T_NUM_STRING @行号开始“VALUES”
答案 0 :(得分:2)
首先,永远不要将原始数据注入数据库。
$cleanData = array();
foreach($_POST as $key => $post) {
$cleanData[$key] = mysqli_real_escape_string($link, $post);
}
现在我们很干净,语法错误是由不正确的字符串语法引起的,但一旦解决了,你也会遇到查询中缺少引号的问题。以下解决了这两个问题:
// note the trailing quotation mark
$sql = 'INSERT INTO vendors (business_name, address, description, contact_name,
contact_phone, alt_phone, url, level, use_me) VALUES ("';
// now let's simplify the meat of the query with an implode.
$sql .= implode('", "', array(
$cleanData['business_name'],
$cleanData['address'],
$cleanData['description'],
$cleanData['contact_name'],
$cleanData['contact_phone'],
$cleanData['alt_phone'],
$cleanData['url'],
$cleanData['level'],
$cleanData['use_me']
));
$sql .= '")'; // and one final quotation mark, along with a closing parenthesis
答案 1 :(得分:-1)
你必须引用所有字符串:
$sql = "INSERT INTO vendors (business_name, address, description, contact_name,
contact_phone, alt_phone, url, level, use_me)
VALUES('".mysql_real_escape_string($_POST['business_name'])."',
'".mysql_real_escape_string($_POST['address'])."',
'".mysql_real_escape_string($_POST['description'])."',
'".mysql_real_escape_string($_POST['contact_name'])."',
'".mysql_real_escape_string($_POST['contact_phone'])."',
'".mysql_real_escape_string($_POST['alt_phone'])."',
'".mysql_real_escape_string($_POST['url'])."',
'".mysql_real_escape_string($_POST['level']."',
'".mysql_real_escape_string($_POST['use_me'])."')";
此外,您必须转义字符串或使用预准备语句。你应该真正阅读SQL注入,因为这是非常糟糕的做法......
答案 2 :(得分:-2)
这个查询有什么问题?
一切。
所以,这是一个合理的代码
$fields = explode(",","business_name,address,description,contact_name,contact_phone,alt_phone,url,level,use_me");
$sql = "INSERT INTO vendors SET ".dbSet($fields);
function dbSet($fields) {
$set='';
foreach ($fields as $key) {
$set .= "`$key`='".mysql_real_escape_string($_POST[$key])."', ";
}
return rtrim($q,", ");
}
请注意,此代码的唯一可变部分是字段列表。您可以在某个配置文件中存储函数,然后每次进行INSERT或UPDATE时,您的代码都会变得更小,重复性更低。
答案 3 :(得分:-2)
值得注意的是,在您的查询中,您不会使用单引号包装$ _POST ['变量']。那些很可能是字符串。因此,在插入查询中,您应该将字符串包装在单引号中。例如:
INSERT INTO TABLE (name,email) values('your_name','your_email');
但您在查询中的内容将如下所示:
INSERT INTO TABLE (name,email) values(your_name,your_email);
没有引号,执行时会产生错误。你应该尝试包装如下:
$sql = "INSERT INTO vendors (business_name, address, description, contact_name,
contact_phone, alt_phone, url, level, use_me)
VALUES('".mysql_real_escape_string($_POST['business_name'])."',
'".mysql_real_escape_string($_POST['address'])."',
'".mysql_real_escape_string($_POST['description'])."',
'".mysql_real_escape_string($_POST['contact_name'])."',
'".mysql_real_escape_string($_POST['contact_phone'])."',
'".mysql_real_escape_string($_POST['alt_phone'])."',
'".mysql_real_escape_string($_POST['url'])."',
'".mysql_real_escape_string($_POST['level'])."',
'".mysql_real_escape_string($_POST['use_me'])."')";
答案 4 :(得分:-3)
Joe,在用PHP编写查询时解决查询的最佳方法是将它们打印到屏幕上,然后将其粘贴到您使用的任何db接口程序的查询字段中 - 例如phpmyadmin或navicat
所以:
<?php
echo $query; die();
?>
这会将你的查询吐出来,而不会在屏幕上显示任何其他内容。
我倾向于将$ _POST分配给变量,因为我发现在查询中更容易使用它们,而且我不太容易让多层引用混淆。我从来没有在查询中直接使用$ _POST。没有测试过,但可能不是编码的最好方法。
我没有看到你的查询中出现错误,但是从你收到的错误消息中,有些东西被引号搞砸了。将它打印到屏幕上,您应该能够发现缺少的引号,或者查看您获取变量的实际名称而不是存储的值。希望这会有所帮助。
答案 5 :(得分:-3)
试试这个
$sql = "INSERT INTO vendors (business_name, address, description, contact_name,
contact_phone, alt_phone, url, level, use_me)
VALUES($_POST['business_name],
$_POST[address],
$_POST[description],
$_POST[contact_name],
$_POST[contact_phone],
$_POST[alt_phone],
$_POST[url],
$_POST[level],
$_POST[use_me])";
不确定我是否错过任何单引号。
更重要的是,您应该使用预准备语句或至少调用mysql_real_escape_string,而不是将这些字符串直接放入查询中。