我有这个代码php / pdo,它工作正常
$id = (int)$_GET['id'];
$place = $DB_con->prepare("SELECT * FROM `post` WHERE `category`=".$id."");
$place->execute();
foreach ($place->fetchAll() as $rawp){
$mains = $DB_con->prepare("SELECT * FROM `place` WHERE `id`=".$rawp['placeid']."");
$mains->execute();
foreach ($mains->fetchAll() as $rawps){
echo $rawps['id'].'<br/>';
}
}
和该代码的结果一样
113
114
125
122
122
127
127
我的问题是:如何只打印一次地方ID?我不希望重复ID 122
。
答案 0 :(得分:3)
SQL可以使用DISTINCT
为您执行此操作,如果JOIN
这两个表,您只需要一个SQL语句,而您甚至不需要SELECT *
所有列但只有你想要的那些:
$places = $DB_con->prepare("SELECT DISTINCT `place`.`id`
FROM `post` JOIN `place` ON `post`.`placeid` = `place`.id
WHERE `post`.`category`=:category");
$places->execute(array('category' => $_GET['id']));
foreach ($places->fetchAll() as $place) {
echo $place['id'] . '<br />';
}
此解决方案比执行两个语句更高效,后来以编程方式减少数据,最重要的是,使用:category
子句中的变量绑定(WHERE
)部分,这可以防止SQL注入。您永远不应该通过连接$ _GET,$ _POST或$ _REQUEST中的数据来创建SQL语句字符串。
答案 1 :(得分:0)
创建一个临时数组,遍历现有数组并将唯一值推入其中,然后遍历临时数组以回显每个唯一值:请参阅以下内容,但我换出了db相关内容并添加了数字作为一个数组 - 这现在有效。你只需要交换你的数据库特定变量,它应该是好的。
$rawps= array("113","114","125","122","122","127","127");
$tempArray=[];
foreach ($rawps as $rawp){
$item = $rawp;
if(! in_array($item, $tempArray)){array_push($tempArray,$item);
}
}
foreach($tempArray as $arrayItem){echo "$arrayItem <br/>";}
打印以下内容 113 114 125 122 127
//$tempArray conteins the following: Array ( [0] => 113 [1] => 114 [2] => 125 [3] => 122 [4] => 127 )
答案 2 :(得分:0)
这应该有效并且每个唯一编号只打印一次
$id = (int)$_GET['id'];
$place = $DB_con->prepare("SELECT * FROM `post` WHERE `category`=".$id."");
$place->execute();
$array = array();
foreach ($place->fetchAll() as $rawp){
$mains = $DB_con->prepare("SELECT * FROM `place` WHERE `id`=".$rawp['placeid']."");
$mains->execute();
foreach ($mains->fetchAll() as $rawps){
if(!in_array($rawps['id'], $array)){
echo $rawps['id'].'<br/>';
}
$array[] = $rawps['id'];
}
}