1

我有一个表,它以这种格式存储与帖子相关的数据

描述 wp_postmeta;

+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| meta_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| post_id    | bigint(20) unsigned | NO   | MUL | 0       |                |
| meta_key   | varchar(255)        | YES  | MUL | NULL    |                |
| meta_value | longtext            | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

meta_key 有一个像'author', 'excerpt', 'download'. 元值有对应的值。

现在我正在编写一个基于 post_id 查询数据库的 php 脚本。所以我需要按指定的顺序显示上表中的所有元数据。查询是:

    $select_post_meta="select meta_value from wp_postmeta where post_id='".$postid."' and (meta_key='author' or meta_key='category' or meta_key = 'excerpt')";

$meta_paper = mysql_query($select_post_meta);

    while(($meta_values = mysql_fetch_array($meta_paper))
            {   echo "<i>'".$meta_values['meta_value']."'</i><br/>";  }

如果元值以与我查询的顺序相同的顺序显示,但它们被定位为第一个描述、类别和作者,那就太好了。有没有其他方法可以查询数据库,以便我可以按第一作者、类别、描述的顺序获取值。谢谢

4

1 回答 1

2

添加

ORDER BY meta_key

到您的查询文本。像这样:

$select_post_meta="select meta_value from wp_postmeta where post_id='".$postid."'
and (meta_key='author' or meta_key='category' or meta_key = 'excerpt')
ORDER BY meta_key";

我强烈建议您通过避免在 SQL 文本中包含“不安全”字符串来阻止 SQL 注入,例如

$select_post_meta = sprintf("select meta_value from wp_postmeta 
where post_id='%s'
and (meta_key='author' or meta_key='category' or meta_key = 'excerpt')
ORDER BY meta_key", mysql_real_escape_string($postid));

碰巧您按字母顺序列出了搜索词,这使得 ORDER BY 表达式非常简单。

如果您以其他顺序需要它们,则可以使用不同的表达式。

ORDER BY CASE meta_key WHEN 'Author' THEN 1 WHEN 'Category' THEN 2 WHEN 'Excerpt' THEN 3 END

我们还注意到,您的查询可能会为每个键返回任意数量的值(假设我们没有看到 (post_id, meta_key) 的唯一约束。

查询可能会返回零、一个或多个 Author、Category 和 Excerpt 值,而您无法知道哪个是哪个。

我的倾向是将 meta_key 也包含在结果集中。然后我的代码将能够判断一个特定的特定meta_value于一个特定的meta_key.

于 2012-06-15T19:31:49.363 回答