5

如果我只用 244 替换第一个 %s,我得到的总和没有任何问题。但是在这种情况下使用动态值 $shot 时,它似乎什么也没得到,而且我的查询也没有失败,因为其他结果都很好(例如 stories.id、story.title)。

$query = sprintf("
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='%s') AS reviews 

FROM stories INNER JOIN users ON stories.uid=users.id WHERE stories.id = '%s'",
    mysql_real_escape_string($shot),
    mysql_real_escape_string($shot));

镜头来自这里:

$shot = $_GET['shot'];      
4

3 回答 3

1

我会写这样的东西。

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'"

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

于 2013-03-01T07:08:27.933 回答
0

鉴于 id 始终是数字,

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

然后替换:

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

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

不需要做mysql_real_escape_string为什么?)。

于 2013-03-01T07:12:44.570 回答
0

在执行查询之前,使用

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 . "'"; 
于 2013-03-01T07:14:13.600 回答