Php 具有动态值的空SUM()

Php 具有动态值的空SUM(),php,mysql,Php,Mysql,如果我将前%s替换为244,则得到的总和不会有任何问题。但是当在本例中使用动态值$shot时,它似乎什么也得不到,我的查询也不会失败,因为其他结果都很好(例如stories.id、stories.title) 镜头从这里传来: $shot = $_GET['shot']; 我会写这样的东西 SELECT stories.id, stories.title, stories.timestamp, stories.text, users.name, users.avata

如果我将前%s替换为244,则得到的总和不会有任何问题。但是当在本例中使用动态值$shot时,它似乎什么也得不到,我的查询也不会失败,因为其他结果都很好(例如stories.id、stories.title)

镜头从这里传来:

$shot = $_GET['shot'];      

我会写这样的东西

SELECT 
stories.id, 
stories.title,  
stories.timestamp, 
stories.text, 
users.name, 
users.avatar, 
users.id AS idus,
SUM(reviews.amount) as reviews
FROM stories 
INNER JOIN users ON stories.uid=users.id 
INNER JOIN reviews ON stories.id = reviews.storyid
WHERE stories.id = '%s'"

这与您的问题无关,但与优化有很大关系。

鉴于id始终是数字

Make
$shot=(int)$\u GET['shot'](%d说明符将变量视为整数,但您可能需要在其他地方使用它)

然后替换:

reviews.storyid='%s'
reviews.storyid=%d

WHERE stories.id='%s'
带有
WHERE stories.id=%d


无需执行
mysql\u real\u escape\u string
()。

在执行查询之前,请使用

echo $query;
看看结果是什么,如果你不喜欢当你把手动值比你需要改变它

我建议使用

$shot = mysql_real_escape_string($shot);
$query = "SELECT 
stories.id, 
stories.title,  
stories.timestamp, 
stories.text, 
users.name, 
users.avatar, 
users.id AS idus,
(SELECT sum(reviews.amount) FROM reviews WHERE reviews.storyid='" . $shot . "') AS reviews 

FROM stories INNER JOIN users ON stories.uid=users.id WHERE stories.id = '" . $shot . "'"; 

故事id真的被认为是字符串吗?如果它应该是数字,请尝试不使用
s,并验证
GET
变量是否为整数。好的,现在尝试
var\u dump($query)
,看看生成的查询字符串到底是什么?此外,ID看起来不应该在单引号中,因为它看起来是一个整数。您应该首先将其验证为一个整数,然后将其放入查询中(
mysql\u real\u escape\u string
也不需要)。转储的输出=224。您在上述问题中的测试值=244。你真的期望他们能产生同样的结果吗?;)你有什么PHP版本?实际上,
mysql.*
已在最新的PHP中删除。必须使用
mysqli.*
使用mysql\u real\u scape\u string()时要小心。。。我认为没有必要对输入进行两次清理,首先使用类型转换
(int)
,然后使用
%d
。您可以使用上面的其中一个,这就足够了。如果代码中的任何其他地方都需要
$shot
,我认为最好将其转换为正确的类型。是的,使用
%d
是非常安全的…在使用
(int)
形成查询之前不需要键入cast
$shot = mysql_real_escape_string($shot);
$query = "SELECT 
stories.id, 
stories.title,  
stories.timestamp, 
stories.text, 
users.name, 
users.avatar, 
users.id AS idus,
(SELECT sum(reviews.amount) FROM reviews WHERE reviews.storyid='" . $shot . "') AS reviews 

FROM stories INNER JOIN users ON stories.uid=users.id WHERE stories.id = '" . $shot . "'";