我正在编写一个用来更新数据库的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其中显示"To use near“似乎是在数据中有空格后显示查询的一部分。我假设我需要在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());提前感谢您的帮助
发布于 2009-12-21 16:49:09
您需要正确转义这些变量,并用单引号将它们括起来:
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的攻击。
编辑
为了简化上面的操作,您可以使用一些技巧:
// 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。
发布于 2009-12-21 16:47:36
因为您直接使用DB (没有DB抽象层),所以最好的解决方案是使用DB转义函数。
只需使用即可。
<?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函数,在这种情况下,将完成这项工作。
发布于 2009-12-21 16:47:41
为什么你要在结尾处放一个\",这会在你的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());https://stackoverflow.com/questions/1938923
复制相似问题