在循环内运行MySQL查询

时间:2015-07-23 09:28:17

标签: php mysql loops

我想在循环中运行多个mysql查询。也许这是错误的方法,但这就是我要问的原因。

示例:

用户提交一个userinput数组,我希望通过它循环执行多个mysql查询。如果我对它的ID进行硬编码,但是如果我将ID设置为VAR,则它会选择。当使用VAR时,它总是显示最后一个条目的结果。

最好,蒂姆

        if(isset($_POST['list'])){ 
            $list=$_POST['list']; 
            $list_arr=explode(PHP_EOL, $list);
            $list_arr_len=count($list_arr);

            for ($i=0; $i < $list_arr_len; $i++) { 
            echo $list_arr[$i]."<br>";
            $result = mysqli_query($con,"SELECT col FROM table where id='$list_arr[$i]'");
            $row=mysqli_fetch_array($result,MYSQLI_NUM);
            echo $row[0]."<br>";


            }
                mysqli_close($con); 
        }

5 个答案:

答案 0 :(得分:1)

您可以在一个查询中执行此操作:

if(!empty($_POST['list'])){ 
            $list=$_POST['list']; 
            $list_arr=explode(PHP_EOL, $list);
            $list_id=implode("', '", array_map('mysqli_real_escape_string', $list_arr));

            $result = mysqli_query($con,"SELECT col FROM table where id IN ('{$list_id}')");
            while($row=mysqli_fetch_array($result,MYSQLI_NUM)) {
            echo $row[0]."<br>";


            }
                mysqli_close($con); 
        }

在这个例子中,无论你使用哪种类型的colum

答案 1 :(得分:0)

我认为这应该有效:

$result = mysqli_query($con,"SELECT col FROM table where id=".mysqli_real_escape_string($list_arr[$i])."");

答案 2 :(得分:0)

首先创建一个包含所有id的字符串,并在查询中使用IN(String of Ids),并将与id对应的所有数据存储在数组中。

$stringIds = "";
for ($i=0; $i < $list_arr_len; $i++) 
{ 
     if (is_null($stringIds))
     {
          $stringIds = '"' . $list_arr[$i] . '"';
     }
     else
     {
          $stringIds .= ',"' . $list_arr[$i] . '"';
     }
}  

$resulSet = mysqli_query($con, ""SELECT col FROM table where id='?'"");
while($row = mysqli_fetch_assoc($resulSet))
{
     mainArray[$row['id']] = $row; 
}

现在,您可以使用foreach循环从数组中获取所有数据,请使用PDO来避免SQL注入。

答案 3 :(得分:0)

问题是:

\ n \ r

这个c0de现在适合我(也是IN(&#39;&#39;)可能是更好的主意):

if(isset($_POST['list'])){ 
            $list=$_POST['list']; 
            //echo $list;
            $replace = array("\n", "\r");
            $id = str_replace( $replace, ",", $list);
            $id_arr = explode(",", $id);
            $id_arr_len = count($id_arr);

            for ($i=0; $i < $id_arr_len; $i++) { 
                # code...
            $result = mysqli_query($con,"SELECT col1,col2 FROM table where id='$id_arr[$i]'");

                while($row = mysqli_fetch_assoc($result)){
                echo $row['col1'].': ';
                echo $row['col2'].'<br/>';
                }

            }

        }

答案 4 :(得分:0)

创建PDO对象并将其设置为异常模式

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try
{
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
} 
catch (PDOException $e) 
{
    echo 'Connection failed: ' . $e->getMessage();
}

你发布了一个以逗号分隔的列表(我发布了一个数组,但是到底是怎么回事),所以我们只是简单地将字符串解析成整数并将其粘贴到MySQL {{{{{{ 1}}子句

IN

注意:我没有测试代码,所以不要复制粘贴它,它很可能包含错误。我写了答案,表明使用if(isset($_POST['list'])) { $list = str_replace(["\r", "\n"], "", $_POST['list']); $numbers = strpos($list, ',') !== false ? explode(",", $list) : (int)$list; // This can probably bet written nicer, the idea is to have each number explicitly typecast to int so it's safe to stick in a query directly // Basically, you want "1,2,3,4,5" without the possibility of having some bad input here if(is_array($numbers)) { $numbers = implode(",", array_map(function($number) { return (int)$number; }, $numbers)); } // And the nice, one liner, where you query and fetch the records which are now in the array called $records $records = $pdo->query(sprintf("SELECT * FROM your_table WHERE id IN(%s)", $numbers))->fetchAll(PDO::FETCH_ASSOC); } 并轻松检索结果是多么容易,只需一行。