SQL Query中的单引号

时间:2009-12-21 08:43:41

标签: php mysql

我正在编写一个用于更新数据库的php脚本,但是当我尝试运行查询时它会发出错误,它会返回错误

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 'id=15"' at line 1

在“数据中有空格”之后,“要近处使用”似乎显示部分查询。我假设我需要将单引号放在数据到php变量查询的位置,但是当我尝试将它们放入(甚至转义引号)时,我从脚本中得到解析错误

SQL查询

    mysql_query("UPDATE Videos SET Title=".$_POST['Title'].", Preacher=".$_POST['Preacher'].", Date=".$_POST['Date'].", Service=".$_POST['Service'].", File=".$_POST['File'].", Description=".$_POST['Description']."WHERE id=".$_GET['vid_id']."\"") or die(mysql_error());

提前感谢您的任何帮助

5 个答案:

答案 0 :(得分:4)

mysql_real_escape_string()sql injections已被提及 但是现在你的脚本(苦心经营)必须将sql语句与数据/参数混合在一起,在下一步中,MySQL服务器必须将数据与语句分开。
使用(服务器端)prepared statements查询的两个“部分”将单独发送,而(MySQL服务器的)SQL解析器永远不会“混淆”语句结束和数据开始的位置。

php-mysql模块不知道预备语句,但php-mysqliPDO不知道。

$pdo = new PDO('mysql:host=localhost;dbname=test', '...', '...'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $pdo->prepare('
  UPDATE
    Videos
  SET
    Title=:title ,
    Preacher=:preacher ,
    Date=:date ,
    Service=:service ,
    File=:file ,
    Description=:description
  WHERE
    id=:id
');
$stmt->bindParam(':title', $_POST['title']);
$stmt->bindParam(':preacher', $_POST['preacher']);
$stmt->bindParam(':date', $_POST['date']);
$stmt->bindParam(':service', $_POST['service']);
$stmt->bindParam(':file', $_POST['file']);
$stmt->bindParam(':description', $_POST['description']);
$stmt->bindParam(':id', $_GET['id']); // really _GET?
$stmt->execute();
如果你只使用$ stmt进行一次操作,那么看起来似乎很臃肿。但是考虑一下,否则你必须为每个参数调用mysql_real_escape_string()。

答案 1 :(得分:1)

由于您直接使用DB API(没有DB抽象级别),最好的解决方案是使用DB转义函数。

只需使用mysql_real_escape_string()

<?php
// Your query
$query = sprintf("UPDATE Videos SET Title='%s', preacher='%s', Date='%s', "
                     ."Service='%s', File='%s', Description='%s' WHERE id='%s'",
                 mysql_real_escape_string($_POST['Title']),
                 mysql_real_escape_string($_POST['Preacher']),
                 mysql_real_escape_string($_POST['Date']),
                 mysql_real_escape_string($_POST['Service']),
                 mysql_real_escape_string($_POST['File']),
                 mysql_real_escape_string($_POST['Description']),
                 mysql_real_escape_string(($_GET['vid_id']));
?>

作为奖励,您可以更好地提高SQL INJECTION attacs以前代码容易出现的安全性。

如果您只是转义斜杠,那么再次使用php / mysql函数addslashes()将完成这种情况下的工作。

答案 2 :(得分:1)

您需要正确地转义变量并用单引号括起来:

mysql_query("UPDATE
                Videos
            SET
                Title = '".mysql_real_escape_string($_POST['Title'])."',
                Preacher = '".mysql_real_escape_string($_POST['Preacher'])."', 
                Date = '".mysql_real_escape_string($_POST['Date'])."',
                Service = '".mysql_real_escape_string($_POST['Service'])."',
                File = '".mysql_real_escape_string($_POST['File'])."',
                Description = '".mysql_real_escape_string($_POST['Description'])."'
            WHERE
                id = '".mysql_real_escape_string($_GET['vid_id'])."'")
or die(mysql_error());

如果没有正确转义变量,您就会让自己容易受到SQL injection attacks的攻击。<​​/ p>

修改

为了简化上述操作,你可以做一些技巧:

// Apply mysql_escape_string to every item in $_POST
array_map('mysql_real_escape_string', $_POST);
// Get rid of $_POST, $_POST['Title'] becomes $p_Title
extract($_POST, EXTR_PREFIX_ALL, 'p_');

// Use sprintf to build your query
$query = sprintf("UPDATE
                Videos
            SET
                Title = '%s',
                Preacher = '%s', 
                Date = '%s',
                Service = '%s',
                File = '%s',
                Description = '%s'
            WHERE
                id = '%s'",
            $p_Title,
            $p_Preacher,
            $p_Service,
            $p_File,
            $p_Description,
            mysql_real_escape_string($_GET['vid_id']));

mysql_query($query) or die(mysql_error());

请注意,不鼓励混合$ _POST和$ _GET变量。您应该通过表单中的隐藏输入字段提供更新ID。

答案 3 :(得分:0)

为什么在最后添加\"权限,这会在SQL的末尾添加",但您在开始时没有?

试试这个:

mysql_query("UPDATE Videos SET Title=".$_POST['Title'].", Preacher=".$_POST['Preacher'].", Date=".$_POST['Date'].", Service=".$_POST['Service'].", File=".$_POST['File'].", Description=".$_POST['Description']."WHERE id=".$_GET['vid_id']) or die(mysql_error());

答案 4 :(得分:0)

删除\“,来自:

id=".$_GET['vid_id']."\""