php mysql语法错误,但我没有';你没看见吗?

php mysql语法错误,但我没有';你没看见吗?,php,mysql,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'],

有人能告诉我这个问题出了什么问题吗

     $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_封装的T_和_空格,需要T_字符串或T_变量或T_NUM_字符串@开始“值”的行号Joe,在PHP中编写查询时解决问题的最佳方法是将它们打印到屏幕上,然后将其粘贴到您使用的任何db接口程序的查询字段中——例如phpmyadmin或navicat

因此:


这将在屏幕上显示您的查询,而不会显示其他内容

我倾向于将$分配给变量,因为我发现这样在查询中使用它们更容易,而且我不太容易混淆多个引用层。实际上,我从来没有在查询中直接使用过$u POST。还没有测试过,但可能不是最好的编码方式


我没有看到您的查询中有错误向我跳出来,但是从您收到的错误消息来看,引号有些混乱。将其打印到屏幕上,您应该能够发现缺少的引号,或者查看从何处获得变量的实际名称,而不是存储的值。希望这有帮助。

您必须引用所有字符串:

 $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注入,因为这是一种非常糟糕的做法…

试试这个

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

首先,不要将原始数据注入数据库

$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
这个查询有什么问题

一切

  • 首先,它不是一个“SQL查询”。从PHP的角度来看,它只是一个普通的字符串,没有特殊意义。它可能是XML的一部分,但有同样的问题
  • 主要问题是您缺乏PHP字符串语法知识。供你参考。如果不认真学习本页,就无法编写任何PHP代码。至少可以学习两种方法来引用字符串中的数组成员
  • 最后,我们来讨论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,", ");
}

请注意,此代码的唯一可变部分是字段列表。您可以将函数存储在某个配置文件中,然后每次插入或更新代码时,代码都会变得非常小,重复性也会降低

值得注意的一点是,在查询中,您没有用单引号将$\u POST['variable']括起来。这些很可能是字符串。因此,在insert查询中,应该将字符串用单引号括起来。例如:

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'])."')";

确保执行
mysqli\u real\u escape\u string
以防止对
$\u POST
的注入攻击。。。。或另一种转义或抽象值的方法。现在首选的方法是使用PDO参数化查询,除非您需要mysqli的专门功能。如果示例也演示了如何转义或使用准备好的语句,那就太好了。mysql_real_escape_string来自旧的mysql扩展,它已经过时得离谱。mysqli于2004年到达,PDO于2005年到达。好吧,mysqli需要过程风格的linkparemer,这将花费我代码中的另一行代码。除了mysql不再受支持之外,我认为mysql没有那么糟糕。让我假设我对这件事了解得更多,并且没有注入旧的mysql,但是使用全新的PDO失败了。不再支持它的事实应该足够了。但不管怎样,
mysql\u real\u escape\u string
仍然使用链接;你的函数就是说不出是哪一个。如果您还没有打开连接,那么它将尝试——可能使用php.ini中的无意义凭据。(参见,与mysqli的版本非常相似,
mysql\u real\u escape\u string
使用链接来确定字符集,以便正确转义内容——如果不指定$link,它将使用最新打开的连接,如果还没有任何连接,则尝试自行连接。)@99%的php脚本不使用链接即可工作。我想你有点夸大了这个问题。@Col.shrapanel:
addslashes
在你转义mysql时,99%的时间都能正常工作。如果你满足于半途而废,那么在同样的失败率下,输入的字符就会少很多。但是我们不使用它,因为1%的失败率太高了。虽然OP在查询语法中确实有错误,但报告的错误是PHP解析错误。我很感兴趣的是,所有注释都是从哪里得到的。该代码将产生错误。使用mysqli是有意义的,但是只有在他们实际使用mysqli时才需要发布代码,尽管有一些令人讨厌的要求:)会在有人想要输入关于Joe餐厅的信息时中断(由于
)。没有一个负责任的答案应该是直接从$\u POST将值注入SQL字符串。@是的,你完全正确。直接使用$\u POST值而不使用
$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'])."')";