我有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>'
我确定这是次要的,但是有人可以告诉我出了什么问题吗?感谢
答案 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
中)并导致拒绝服务,或者更糟糕的是,如果有些查询允许发出DELETE
或DROP
命令。
第二个问题是该值可能包含空格,这会破坏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'";