我的 mysql 数据库中有 2 个表:users 和 pets。在 users 表中,有一个字段包含用户拥有的宠物的分号分隔列表 (pet_ids = 1;2;3;4;)。这些 id 对应于 pets 表中包含宠物名称的唯一 id(键)(1 = rex、2 = goldie、3 = squeak、4 = bubble)。
我想在 PHP 页面上按字母顺序显示这些宠物的列表,但保留宠物名称的 id,以便在单击宠物名称时作为变量传递到另一个页面。
实现这一目标的最有效方法是什么。
到目前为止,我生成的列表不是按字母顺序排列的,而是按照添加宠物的顺序排列的 -
查询数据库的函数
function getUserPets($user_id) {
$query= "SELECT pet_ids FROM users WHERE id='$user_id'";
$result = @mysql_query ($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
while($row = mysql_fetch_array($result)) {
$the_pets = $row['pet_ids'];
}
return $the_pets; //1;2;3;4;
}
function getPetName($id) {
$name = "";
$query= "SELECT name FROM pets WHERE id='" . $id . "' ";
$result = @mysql_query ($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
while($row = mysql_fetch_array($result)) {
$name = $row['name'];
}
return urldecode($name);
}
生成列表的代码...
$petstring = getUserPets($userid);
$petsarray = explode(";", $petstring);
foreach ($petsarray as $pet_id) {
echo("<li><h4><a href=\"pet.php?id=$pet_id\">" . writeListPetName($pet_id) . "</a></h4></li>");
}
获取按字母顺序排列的列表的最有效方法是什么 - 我需要保持数据库结构相同。
最佳答案
如果您必须使用一组 id 的单独列表,而不是正确规范化的表,那么至少使用单个数据库查询来返回一组宠物名称,而不是为每个单独的宠物单独查询。
$petsarray = implode(',',explode(";", $petstring));
function getPetName($ids) {
$name = "";
$query= "SELECT id, name FROM pets WHERE id IN (" . $ids . ") ORDER BY name";
$result = mysql_query ($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
while($row = mysql_fetch_array($result)) {
$names[$row['id']] = urldecode($row['name']);
}
return $names;
}
var_dump($names);
并且不要使用@来抑制错误,而是正确地捕获错误
附注为什么需要对宠物名进行 urldecode()?
关于php - 根据另一个表中的关联字符串查询和排序以分号分隔的 id 列表的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289441/