为什么foreach循环中的PHP-Mysql查询总是从数据库返回第一个结果?

为什么foreach循环中的PHP-Mysql查询总是从数据库返回第一个结果?,php,mysql,Php,Mysql,我试图在foreach循环中运行一个MYSQL查询 以下是场景: 我有一个逗号分隔的字符串,里面有一些名字 我使用explode()和foreach()从这个逗号分隔的字符串中获取单独的值/名称 然后,我需要在mysql数据库中搜索从该字符串中获得的每个值/名称,如果该值存在于数据库中,则获取其ID并在数据库中的另一个表中创建一个新的RECORD 但是,当我运行代码时,我只从逗号分隔的字符串中获取第一个实例的ID 我的mysql数据库如下所示: id category_name 3

我试图在foreach循环中运行一个MYSQL查询

以下是场景:

我有一个逗号分隔的字符串,里面有一些名字

我使用explode()和foreach()从这个逗号分隔的字符串中获取单独的值/名称

然后,我需要在mysql数据库中搜索从该字符串中获得的每个值/名称,如果该值存在于数据库中,则获取其ID并在数据库中的另一个表中创建一个新的RECORD

但是,当我运行代码时,我只从逗号分隔的字符串中获取第一个实例的ID

我的mysql数据库如下所示:

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/>';

    }
}