Php 具有动态值的空SUM()
如果我将前%s替换为244,则得到的总和不会有任何问题。但是当在本例中使用动态值$shot时,它似乎什么也得不到,我的查询也不会失败,因为其他结果都很好(例如stories.id、stories.title) 镜头从这里传来: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
$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 . "'";