查询无效:SQL语法中存在错误;特殊字符

时间:2016-02-26 20:26:18

标签: php database

我正在做php并编写一些代码来同时将数据插入到不同的表中。我写了一个foreach循环,我的代码的一部分如下:

 while ($datarow = dbgetrow($dataresult)) {
                    if ( $dotcount > $datanumrows) {
                            showarchivestatus(" .", true);
                            $dotcount = 1;
                    }
                    $sqlvalues = "";
                    foreach($lu_cols as $lu_col) {
                            if ($datarow[$lu_col] == "") {
                                $sqlvalues = $sqlvalues.", NULL ";
                            } else {
                                    $sqlvalues = $sqlvalues.", \"".makesafe($datarow[$lu_col])."\"";
                            }
                    }
                    $sqlinsert = "INSERT INTO ".$lu_table." VALUES(".substr($sqlvalues,2).")";
                            $archivedb = dbconnect($a_host, $a_dbname, $a_port, $a_user, $a_password);
                    dbrunquery($sqlinsert, $archivedb);
                    $dotcount++;
            }

这是函数makesafe:

function makesafe($text)
{
   $instring = strpos($text, "'");
   while ( $instring >= 0 )
   {
         if ( $instring === false )
             break;

         if ( substr($text, $instring-1, 1) != "\\" )
         {
              $text = substr($text, 0, $instring)."\\".substr($text, $instring, strlen($text)-$instring);
          }
         $instring = strpos($text, "'", $instring + 1);
    }

   $instring = strpos($text, '"');
   while ( $instring >= 0 )
   {
     if ( $instring === false )
        break;

     if ( substr($text, $instring-1, 1) != "\\" )
     {
     $text = substr($text, 0, $instring)."\\".substr($text, $instring, strlen($text)-$instring);
     }
     $instring = strpos($text, '"', $instring + 1);
    }

 return $text;
}

但我得到了错误:

  

查询无效:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第1行的“support.microsoft.com/default.aspx?scid = kb \”)附近使用正确的语法       SQLStatement = INSERT INTO引用VALUES(“5441461”,“4”,“support.microsoft.com/default.aspx?scid=kb \”)

我知道问题是特殊字符\,但我仍然希望使用此特殊字符插入数据。如何更改它并成功插入数据?许多人都欣赏任何答案。谢谢。

1 个答案:

答案 0 :(得分:2)

在将字符串放入数据库之前,您需要转义它。

以下是如何在MySQLi中执行此操作的基本示例

<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// escape variables for security
$firstname = mysqli_real_escape_string($con, $_POST['firstname']);
$lastname = mysqli_real_escape_string($con, $_POST['lastname']);
$age = mysqli_real_escape_string($con, $_POST['age']);

$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES ('$firstname', '$lastname', '$age')";

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "1 record added";

   mysqli_close($con);
?>

以下是PDO的一个示例:

<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* Dangerous string */
$string = 'Naughty \' string';
print "Unquoted string: $string\n";
print "Quoted string:" . $conn->quote($string) . "\n";
?>

您可能需要考虑使用预先准备好的声明。这有几个好处,包括:

  1. 安全性 - 有助于防止SQL注入
  2. 速度 - 您只是发送值。
  3. http://www.w3schools.com/php/php_mysql_prepared_statements.asp

    来源:

    http://www.w3schools.com/php/func_mysqli_real_escape_string.asp

    http://php.net/manual/en/mysqli.real-escape-string.php

    http://php.net/manual/en/pdo.quote.php