如何通过sql子句传递一个参数以便在命令中使用?

时间:2011-11-28 17:31:44

标签: php mysql sql

使用PHP / MySQL,如何通过SQL子句下订单?

此语法不起作用:

$diplayquery = sprintf("
  SELECT *
  FROM  user_urls 
  WHERE user_id='%s' 
  ORDER BY total_count",
    mysql_real_escape_string($iduse) );

$diplayqueryout = mysql_query($diplayquery);

2 个答案:

答案 0 :(得分:3)

SQL 中,order by条款的写法如下:

SELECT * FROM TABLENAME WHERE condition ORDER BY FieldName [ ASC | DESC ] ; 

示例:

SELECT * FROM students ORDER BY first_name ASC;

这将选择所有学生并按first_name(升序)订购。

因此,在您的情况下,您应该确保您的查询不返回一行,因为您正在user_id上进行测试,这可能是唯一。要确保您的请求,请尝试在 PHPMyAdmin 上执行该请求,并查看它是否返回结果。

答案 1 :(得分:2)

您的SQL语法没有任何内在错误,但是,您的方法有一些方面可能会有所不足。

最重要的是,你的错误。由于您没有提到任何特定错误,因此我只能假设您尝试订购的列不存在于user_urls表中。假设ID为“1”:

SELECT * FROM user_urls WHERE user_id=1 ORDER BY total_count

...只要total_count列存在,就是有效的sql。查看文档here

我在这里看到的第二个问题是你使用sprintf和经典的mysql_ PHP数据库函数。如果你想使用这样的值替换,而不必费心去调用每个值的转义函数,那么使用PDO会更好。查看该页面以获取信息和示例。如果你不打算使用PDO,你就没有理由进行精心设计的字符串连接(这样做绝对没有优势),相反,直接的方法同样有效,安全,而且肯定更清晰:

$diplayquery = '
    SELECT 
        column1,
        column2,
        column3 
    FROM 
        user_urls 
    WHERE 
        user_id='.mysql_real_escape_string($iduse).' 
    ORDER BY 
        total_count
';
$diplayqueryout = mysql_query($diplayquery);

最后,我建议您不要使用SELECT *方法。显式地命名从数据库中提取的列被认为是更好的做法,这样您的结果集就不是谁知道哪些字段的“神奇”集合。使用SELECT *代替SELECT columnName1, columnName2, etc,如上面的代码示例所示。