首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询中的单引号

问SQL查询中的单引号
EN

Stack Overflow用户
提问于 2009-12-21 16:43:41
回答 4查看 4.7K关注 0票数 0

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

代码语言:javascript
复制
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

其中显示"To use near“似乎是在数据中有空格后显示查询的一部分。我假设我需要在php变量中查询数据的位置加上单引号,但是当我尝试将它们放入(甚至转义引号)时,脚本会出现解析错误

SQL查询为

代码语言:javascript
复制
    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());

提前感谢您的帮助

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-21 16:49:09

您需要正确转义这些变量,并用单引号将它们括起来:

代码语言:javascript
复制
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的攻击。

编辑

为了简化上面的操作,您可以使用一些技巧:

代码语言:javascript
复制
// 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。

票数 1
EN

Stack Overflow用户

发布于 2009-12-21 16:47:36

因为您直接使用DB (没有DB抽象层),所以最好的解决方案是使用DB转义函数。

只需使用即可。

代码语言:javascript
复制
<?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函数,在这种情况下,将完成这项工作。

票数 1
EN

Stack Overflow用户

发布于 2009-12-21 16:47:41

为什么你要在结尾处放一个\",这会在你的SQL结尾处放上一个",但是在开头却没有?

试试这个:

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1938923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档