php多个阵列多次爆炸

时间:2017-10-01 14:47:40

标签: php sql arrays explode

Php代码

<?php
$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);

foreach ($d2 as $key => $value) {
    $arr1 = explode(':',$d2[$key]);

    foreach ($arr1 as $key1 => $value1) {
    $arr1[] = $key1;
            }
    echo $arr1[0] . ","  . $arr1[1] . ",";
    }
?>

结果

 a,1,b,2,c,3,d,4,

字段(a,b,c,d)(字段编号变量..有时为4或10 ..)

(1,2,3,4)

预期结果

Insert into Table1 (a,b,c,d) values (1,2,3,4)

我该如何做到这个结果? (如果它是一个完整的例子会很好)

感谢所有答案

6 个答案:

答案 0 :(得分:1)

在最近的PHP版本中,您可以将$ d2 [$ key]上的explode()结果(你应该改进你的命名,它有所帮助!)分解为两个独立的数组,如下所示:

$keys = $values = [];
foreach (explode(',', $d1) as $parameter) 
    [$keys[], $values[]] = explode(':', $parameter);

var_dump($keys, $values);
var_dump(array_combine($keys, $values));

之后,您可以将其构建到查询中。但是,您的数据似乎可能是用户提供的,因此您应该非常警惕这些数据。您似乎几乎在代码中引入了SQL注入漏洞。

我建议在白名单中检查$ keys数组,然后在查询中使用任何这些之前正确转义所有$值。您可以在此处找到一些信息:PDO with INSERT INTO through prepared statements

答案 1 :(得分:1)

我知道preg_split()可以完成任务。但是在我遇到类似问题的最后一天,我在http://php.net/manual/en/function.explode.php#111307

的帮助下完成了这个解决方案
function multiexplode ($delimiters,$string) {

    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
}

$d1 = "a:1,b:2,c:3,d:4";
$result = implode(',',multiexplode(array(",",".","|",":"),$d1));
echo $result;

请参阅演示:https://eval.in/871705

编辑按照SO的评论

$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
$result =  [];
foreach ($d2 as $key => $value) {
    list($k,$v) = explode(':',$value);
    $result[$k] = $v;
}
print '<pre>';
print_r($result);
print '</pre>';
echo "INSERT INTO table1 (".implode(', ',array_keys($result)). ") VALUES (".implode(', ',array_values($result)). ")";

答案 2 :(得分:0)

您可以使用preg_split$output = preg_split( "/ (,|:) /", $input );

接下来,您可以循环检查。

foreach ($output as $value)
   {
      if(is_number($value))
         $keys[] = $value;
      else
         $values[] = $value;    

   }

答案 3 :(得分:0)

尝试使用以下逻辑:

<?php
if(isset($_POST['submitDelivered'])){  
  $order_id = trim(addslashes($_POST['t_order_id']));
  $query = "UPDATE order_tbl SET `order_status`='Delivered' WHERE `order_id` = $order_id";
  if (mysqli_query(connection2(), $query)) { 
         mysqli_query(connection2(), "COMMIT");
         $_SESSION['message'] = "Order Delivered"; } 
         else { 
         $_SESSION['message'] = mysqli_error(connection2());
         mysqli_query(connection2(), "ROLLBACK");
         }
  }

  if(isset($_POST['submitAccept'])){  
  $order_id = trim(addslashes($_POST['t_order_id']));
  $query = "UPDATE order_tbl SET `order_status`='Accepted' WHERE `order_id` = $order_id";
  if (mysqli_query(connection2(), $query)) { 
         mysqli_query(connection2(), "COMMIT");
         $_SESSION['message'] = "Order Accepted"; } 
         else { 
         $_SESSION['message'] = mysqli_error(connection2());
         mysqli_query(connection2(), "ROLLBACK");
         }
  }      

  if(isset($_POST['submitCancel'])){  
  $order_id = trim(addslashes($_POST['t_order_id']));
  $query = "UPDATE order_tbl SET `order_status`='Cancelled' WHERE `order_id` = $order_id";
  if (mysqli_query(connection2(), $query)) { 
         mysqli_query(connection2(), "COMMIT");
         $_SESSION['message'] = "Order Cancelled"; } 
         else { 
         $_SESSION['message'] = mysqli_error(connection2());
         mysqli_query(connection2(), "ROLLBACK");
         }
  }      
  ?>

以逗号分隔所有字段和值:

foreach ($d2 as $key => $value) { 
   $arr1 = explode(':', $value); 
   if (count($arr1) == 2){
      $arr[$arr1[0]] = $arr1[1];
   } 
}

将这些变量用于您的查询:

$fields = array_keys($arr);
¢values = array_values($arr);

正在运行snipet:https://ideone.com/EXAPOt

答案 4 :(得分:0)

由于字符串接近json格式,我认为使其成为真正的json并解码它意味着没有循环或爆炸是一种有效的解决方案。

$d1 = "a:1,b:2,c:3,d:4"; 
$d1 = "{\"".str_replace(array(",",":"),array('","','":"'), $d1)."\"}";

$arr = json_decode($d1, true);
$table = array_keys($arr);
$values = array_values($arr);

Var_dump($table);
Var_dump($values);

https://3v4l.org/Yqrbe

编辑;如果你需要你命名为预期结果的字符串,请使用:

$str ="Insert into Table1 (". Implode(",", $table) .") values (" . Implode(",", $values).")";
Echo $str;

答案 5 :(得分:0)

在代码下方使用。 只需对代码进行一点点更改就可以了。

switch (args[0]) {
        case "ping"; //here should be :
            message.channel.sendMessage("Pong!");
            break;
}