比较WHERE语句中的字符串(变量)

时间:2013-07-15 12:45:06

标签: php sql

我有PHP脚本使用SQL查询将JSON保存在变量中。查询是这样的(我已经将列的名称更改为更通用的名称)

$value = $_GET['value'];

SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5'
FROM db.dbo.table
WHERE column5 = $value

变量来自另一个页面,它是一个可能包含或不包含空格的字符串。但是,这不会返回任何JSON,我不知道为什么(它只返回[])。此示例脚本在SQL Server中运行良好,但是当我尝试在PHP中运行它时,它不起作用。如果我删除了行WHERE column5 = $value,脚本将返回JSON。这是在另一页上的JS脚本中传递变量的行

return '<a href="/script.php?value=' + data + '" target="_blank">Example</a>'

我确定这是次要的,但是有人可以告诉我出了什么问题吗?感谢

4 个答案:

答案 0 :(得分:2)

where子句中添加引号:例如。 where column5 = '$value'

答案 1 :(得分:2)

$query="SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 ='". $_GET['value']."'";
OR
$query="SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 ='". $value."'";

答案 2 :(得分:2)

您的方法存在两个问题(除了不使用预准备语句)。

首先是您信任用户输入:

$value = $_GET['value'];

这应该被某种$value的转义所取代,这样一个人就不能执行任意查询(例如在SUBSELECT中)并导致拒绝服务,或者更糟糕的是,如果有些查询允许发出DELETEDROP命令。

第二个问题是该值可能包含空格,这会破坏SQL语法,除非您添加了引号:

SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5'
FROM db.dbo.table
WHERE column5 = '$value'

明智地使用prepared statements,您可以一次性解决这两个问题。

同一第二个问题的另一个方面是,如果通过URL传递的值包含URL引用的字符(例如+,%等)或编码,则可能会遇到转义问题如果值超过编码边界(例如,原始页面是,或自动识别为,或者可能被强制识别为,ISO-8859-15且数据库为UTF-8,则会出现问题)最后一个问题没有“一刀切”的解决方案 - 即使准备好的语句可能有帮助 - 并要求您仔细检查变量的编码路径,或者强制所有内容始终转换为UTF-8。您可以通过在包含链接的页面中的值中放置国际字符(例如“à”)并查看发生的情况来验证您是否存在风险。

答案 3 :(得分:0)

尝试:

$sql = "SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 = '$value'";