我正在编写一个用于更新数据库的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());
提前感谢您的任何帮助
答案 0 :(得分:4)
mysql_real_escape_string()和sql injections已被提及
但是现在你的脚本(苦心经营)必须将sql语句与数据/参数混合在一起,在下一步中,MySQL服务器必须将数据与语句分开。
使用(服务器端)prepared statements查询的两个“部分”将单独发送,而(MySQL服务器的)SQL解析器永远不会“混淆”语句结束和数据开始的位置。
php-mysql模块不知道预备语句,但php-mysqli和PDO不知道。
$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']."\""