5

最初の %s を 244 だけに置き換えると、問題なく合計が得られます。しかし、この場合 $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 に答える