为什么foreach循环中的PHP-Mysql查询总是从数据库返回第一个结果?
我试图在foreach循环中运行一个MYSQL查询 以下是场景: 我有一个逗号分隔的字符串,里面有一些名字 我使用explode()和foreach()从这个逗号分隔的字符串中获取单独的值/名称 然后,我需要在mysql数据库中搜索从该字符串中获得的每个值/名称,如果该值存在于数据库中,则获取其ID并在数据库中的另一个表中创建一个新的RECORD 但是,当我运行代码时,我只从逗号分隔的字符串中获取第一个实例的ID 我的mysql数据库如下所示:为什么foreach循环中的PHP-Mysql查询总是从数据库返回第一个结果?,php,mysql,Php,Mysql,我试图在foreach循环中运行一个MYSQL查询 以下是场景: 我有一个逗号分隔的字符串,里面有一些名字 我使用explode()和foreach()从这个逗号分隔的字符串中获取单独的值/名称 然后,我需要在mysql数据库中搜索从该字符串中获得的每个值/名称,如果该值存在于数据库中,则获取其ID并在数据库中的另一个表中创建一个新的RECORD 但是,当我运行代码时,我只从逗号分隔的字符串中获取第一个实例的ID 我的mysql数据库如下所示: id category_name 3
id category_name
3 Hotel
4 Restaurants
//My comma separated string///
$biz_cat = 'Hotel, Restaurants';
///i do the explode and foreach here///
$arrs = explode(',', $biz_cat);
foreach($arrs as $arr){
$sql99 = "SELECT * FROM categories WHERE category_name='$arr'";
$query99 = mysqli_query($db_conx, $sql99);
while($row99 = mysqli_fetch_array($query99, MYSQLI_ASSOC)){
$catIDS = $row99['id'];
}
//this is where i need to insert my new data in different tabel.
echo $catIDS.'<br>;
}
这是我的代码:
id category_name
3 Hotel
4 Restaurants
//My comma separated string///
$biz_cat = 'Hotel, Restaurants';
///i do the explode and foreach here///
$arrs = explode(',', $biz_cat);
foreach($arrs as $arr){
$sql99 = "SELECT * FROM categories WHERE category_name='$arr'";
$query99 = mysqli_query($db_conx, $sql99);
while($row99 = mysqli_fetch_array($query99, MYSQLI_ASSOC)){
$catIDS = $row99['id'];
}
//this is where i need to insert my new data in different tabel.
echo $catIDS.'<br>;
}
基于我在MYSQL中拥有的功能,我希望它如下所示:
3
4
有人可以就这个问题提出建议吗?现在,您正在为查询返回的每个记录重新为标量变量
$catIDS
赋值,然后您echo
它就是一个循环。您需要将echo/insert逻辑放入循环中(或者可能将值存储在数组中)
另一件需要注意的事情是,您正在使用,
(一个逗号)进行拆分,但两个单词之间有一个空格。因此,第二个值(Restaurant
)以空格开头,这将导致查询返回空结果集。您可能希望使用,
(逗号后跟空格)进行拆分
$biz_cat='Hotel,Restaurants';
$arrs=爆炸(“,”,$biz_cat);
foreach($arrs作为$arr){
$sql99=“从类别中选择*,其中类别名称为“$arr”;
$query99=mysqli\u查询($db\u conx,$sql99);
而($row99=mysqli_fetch_数组($query99,mysqli_ASSOC)){
$catIDS=$row99['id'];
//这就是我需要在不同选项卡中插入新数据的地方。
echo$catIDS.“
”;
}
}
首先,这些事情应该使用准备好的语句来完成。它不仅更容易、更快,而且更安全。记住总是使用事先准备好的语句
//My comma separated string///
$biz_cat = 'Hotel, Restaurants';
$stmt = $db_conx->prepare('SELECT * FROM categories WHERE category_name=?');
$stmt->bind_param('s', $cat);
foreach(explode(',', $biz_cat) as $cat){
$cat = trim($cat); // remove extra spaces at the beginning/end
$stmt->execute();
// we fetch a single row, but if you expect multiple rows for each category name, then you should loop on the $stmt->get_result()
$row99 = $stmt->get_result()->fetch_assoc();
// echo it in the loop or save it in the array for later use
echo $row99['id'];
}
在这里的示例中,我准备了一条语句并绑定了一个变量$cat
。然后,我将字符串分解成一个数组,在该数组上直接循环。在每次迭代中,我都执行我的语句,这反过来又产生一个结果。由于您似乎只对返回的第一行感兴趣,因此不需要循环结果,我们可以立即请求数组。如果您想循环,只需替换
$row99 = $stmt->get_result()->fetch_assoc();
与
在数组中获得id后,可以将其打印出来,也可以将其保存到数组中供以后使用 下面的代码可以满足您的需要 更新
在此处插入新数据
$biz_cat = 'Hotel, Restaurants';
$arrs = explode(',', $biz_cat);
foreach ($arrs as $arr) {
$query99 = mysqli_query($db_conx, "SELECT * FROM categories WHERE category_name='$arr'");
while ($row99 = mysqli_fetch_array($query99, MYSQLI_ASSOC)) {
$catIDS = $row99['id'];
// INSERT YOUR NEW DATA HERE
echo $catIDS . '<br/>';
}
}
$biz_cat='Hotel,Restaurants';
$arrs=爆炸(“,”,$biz_cat);
foreach($arrs作为$arr){
$query99=mysqli\u query($db\u conx,“从类别中选择*,其中类别名称=“$arr”);
而($row99=mysqli_fetch_数组($query99,mysqli_ASSOC)){
$catIDS=$row99['id'];
//在此处插入新数据
echo$catIDS.“
”;
}
}
每次都覆盖该值。您需要将该scho语句放入循环中,或者以不同的方式跟踪这些值。@johncode,如果您的意思是这样的:$variable.=$CatIDS代码>那么这对我没有用。在我的真实代码中,我有另一个INSERT
查询,而不是echo
语句。您应该会得到echo的解析错误。是坏浆糊吗?它缺了一句话,我也试过了。仍然只在逗号分隔的字符串中插入名字的ID。@samsexton:如果使用echo
运行此代码,您将看到循环的每次迭代都会得到不同的类别ID。试试看。用你的代码,echo$catIDS.
仅返回3
一次。逗号后的额外空格也有问题。请参阅我的更新答案。@GMB,是的,问题只是字符串中的空格。
$biz_cat = 'Hotel, Restaurants';
$arrs = explode(',', $biz_cat);
foreach ($arrs as $arr) {
$query99 = mysqli_query($db_conx, "SELECT * FROM categories WHERE category_name='$arr'");
while ($row99 = mysqli_fetch_array($query99, MYSQLI_ASSOC)) {
$catIDS = $row99['id'];
// INSERT YOUR NEW DATA HERE
echo $catIDS . '<br/>';
}
}