Php foreach循环的迭代问题

Php foreach循环的迭代问题,php,mysql,arrays,loops,foreach,Php,Mysql,Arrays,Loops,Foreach,我试图创建一个函数,创建一个sql语句,将数据插入数据库,这是一个代码片段。除了最后一个foreach循环外,它工作正常。由于某种原因,它不会迭代到数组中的最后一个元素,而是停留在第二个元素上。问题是,第一个foreach循环是相同的代码,工作正常,但第二个给我带来了麻烦 *注意:foreach循环中的if语句应该捕获数组中的最后一个元素,并确保未插入“,”。这就是问题所在。如果我从第二个循环中取出If语句,循环将迭代到最后一个元素,但如果没有If块,它会在末尾放置逗号,并创建SQL语法错误 第

我试图创建一个函数,创建一个sql语句,将数据插入数据库,这是一个代码片段。除了最后一个foreach循环外,它工作正常。由于某种原因,它不会迭代到数组中的最后一个元素,而是停留在第二个元素上。问题是,第一个foreach循环是相同的代码,工作正常,但第二个给我带来了麻烦

*注意:foreach循环中的if语句应该捕获数组中的最后一个元素,并确保未插入“,”。这就是问题所在。如果我从第二个循环中取出If语句,循环将迭代到最后一个元素,但如果没有If块,它会在末尾放置逗号,并创建SQL语法错误

第一个循环的输出

INSERT INTO gardyloo.users (joe,bob,joe@hotmail.com,8de,154927,2014-12-18,2014-12-18 7:02:11)
不带中频的第二个环路的输出

VALUES (:firstName,:lastName,:emailAddress,:password,:userid,:date_joined,:timestamp,)
带if的第二个循环的输出

VALUES (:firstName,:lastName,:emailAddress,:password,:userid,:date_joined)  

foreach( $values as $a => $b ){

        if(next($values) == null){
            $sql .= $b."";
            break;
        }
        $sql .= $b.",";
    }
    $sql .= ") ";
    $sql .= "VALUES (";
    foreach( $values as $a => $b ){

        if(next($values) == null){
            $sql .= ":".$a;
            break;
        }
        $sql .= ":".$a.",";
    }
$sql .= ")";
*编辑,此代码似乎工作正常:

$sql .= implode(', ', array_keys($values));
$sql .= ") ";
$sql .= "VALUES (:";
$sql .= implode(", :", array_keys($values)); 
$sql .= ")";    

使用continue代替break;Break中断循环,而continue只移动到下一个迭代

试试这个:

foreach( $values as $a => $b ){

    if($b == null){
        continue;
    }
    $sql .= ":".$a.",";
}

这样做:

       //Your data 
       $values = array(
                       'firstName'    => 'Joe', 
                       'lastName'     => 'bob', 
                       'emailAddress' => 'joe@hotmail.com', 
                       'password'     => '8de', 
                       'userid'       => 154927, 
                       'date_joined'  => '2014-12-18', 
                       'timestamp'    => '2014-12-18 7:02:11'
                       );

        //Begins the sentence
        $sql    = 'INSERT INTO gardyloo.users(';

        /**
         * Begins example code.
         * - array_keys shows the key as a value
         *   example: $values[0] = firstName
         */
        foreach(array_keys($values) as $k => $v)
        {
            //when the array arrives at the end, doesn't show ','
            if($k != count($values)-1)
                $sql .= $v.",";
            else
                $sql .= $v;
        }

        $sql .= ") ";
        $sql .= "VALUES (";
        $k = 0;//the new count initialized

        foreach($values as $v)
        {
            //when the array arrives at the end, doesn't show ','
            if($k != count($values)-1)
                $sql .= $v.",";
            else
                $sql .= $v;
            //increments the counter
            $k++;
        }

        $sql .= ");";
注意事项:

  • 在函数中分隔代码,因为两个foreach非常相似
  • 可以使用foreach值返回所需的值
  • 如果你有更多关于它的问题,请问我

    • 否则我会做的。创建两个变量,$columns和$value,而不是concat一个字符串
      $sql
      ,它们都是数组。这样做不需要循环

      下面是我将如何做到这一点:

      $columns = array_keys($values);
      
      $sql = "INSERT INTO table (". implode(" ,", $columns) . ") VALUES (". implode(" ,", $values);
      
      在这里,您不需要测试它是否是数组中进行
      中断的最后一个元素


      希望有帮助;)

      您不应该在生产环境中执行此操作。你让自己暴露在攻击面前。始终使用参数化语句。您所说的参数化语句是什么意思?我应该提到$sql后面的一行;是$query=$init->link->prepare($sql);这意味着什么?我对PHP不是很熟悉,但本质上,我建议如下:$query=$init->link->prepare(“插入gardyloo.users值(?,,,,,,,,,?)”;然后,运行for循环(如果要添加多行,否则没有for循环)来运行查询
      $query->execute($firstName、$lastName、$emailAddress、$password、$userId、$datejoin、$timestamp)这似乎不起作用。它确实有助于迭代到最后一个元素,但做得不正确。