php mysql语法错误但是我没有看到它?

时间:2011-11-03 04:51:53

标签: php mysql

有人可以告诉我这个查询有什么问题吗?

     $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”

6 个答案:

答案 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)

  

这个查询有什么问题?

一切。

  • 首先,它不是“SQL查询”。从PHP的角度来看,它只是一个普通的字符串,没有特殊含义。它可能是具有相同问题的XML的一部分。
  • 主要问题是你缺乏PHP字符串语法知识。 http://php.net/types.string供您参考。如果不仔细研究这个页面,你就不能编写任何单个PHP代码你可以学习至少2种方法来引用字符串中的数组成员。
  • 最后我们来了SQL语法,你也遇到了问题。你应该来转义每个字符串,然后再将它添加到查询中,并将其括在引号中。
  • 有点复杂,但同样重要的是,总是忘记了当地人:编程。每次看到重复时,都应该开始使用编程技能了。为了减少您的案例中的重复,因为此处显示的每个代码看起来都很丑陋并且随着字段和查询的数量而增长。

所以,这是一个合理的代码

$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,而不是将这些字符串直接放入查询中。