Php 在foreach中使用分解数组,并且只在表中插入最后一个数组,数组是如何工作的?

Php 在foreach中使用分解数组,并且只在表中插入最后一个数组,数组是如何工作的?,php,mysql,arrays,foreach,Php,Mysql,Arrays,Foreach,我从html表单中得到一个文本,这里没有提到,但它看起来像: 约翰:约翰 迈克:迈克 Root:管理员 以下是我的php代码: $text = explode("\n", $_POST["info"]); // - get data from html form and //explode it to pieces print_r($text); // result is: Array ( [0] => John:John [1] => Mike:Mike [2]

我从html表单中得到一个文本,这里没有提到,但它看起来像:

  • 约翰:约翰
  • 迈克:迈克
  • Root:管理员
以下是我的php代码:

   $text = explode("\n", $_POST["info"]); 
// - get data from html form and //explode it to pieces
    print_r($text);
// result is: Array ( [0] => John:John [1] => Mike:Mike [2] => Root:Admin )
    foreach ($text as $key => $value) {
      $val = explode (":", $value);
// want to explode it to pieces, result must be 0=>John 1=>John, 0=>Mike 1=>Mike, [0]=>Root [1]=>Admin
$sql = "INSERT INTO `redtable`(`NAME`,`NAME2`) VALUES('$val[0]','$val[1]');";
    }
当这段代码运行时,它只在数据库中插入最后一行,即(Root:Admin),为什么它不插入John:John,Mike:Mike。。。? 错在哪里

下面是echo$sql的结果:

INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('John','John ');INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('Mike','Mike ');INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('Root','Admin');
以下是完整的代码:

<?php

$servername = "localhost";
$username = "mysql";
$password = "mysql";
$dbname = "red";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
$pieces = explode("\n", $_POST["info"]);
foreach ($pieces as $key => $value) {
  $val = explode (":", $value);
  $sql = "INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('$val[0]','$val[1]');";
echo $sql;
}
if ($conn->query($sql) === TRUE) {
   echo "Days left updated";
} else {
  mysqli_error($conn);
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>
同样的结果是,只有最后一行插入到数据库中


伙计们,如果有人需要有效的解决方案,请看@Matt Rabe answer-像符咒一样工作,你只需要更换支架

Mark Baker是对的-您正在foreach循环之外执行sql。您正在foreach中定义$sql变量,但它的实际执行(
$conn->query($sql)
)发生在foreach之外

更改此项:

foreach ($pieces as $key => $value) {
  $val = explode (":", $value);
  $sql = "INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('$val[0]','$val[1]');";
echo $sql;
}
if ($conn->query($sql) === TRUE) {
   echo "Days left updated";
} else {
  mysqli_error($conn);
    echo "Error: " . $sql . "<br>" . $conn->error;
}
foreach($key=>$value){
$val=分解(“:”,$value);
$sql=“插入到`redtable`(`IGNAME`,`IGPASS`)值('$val[0]','$val[1]');”;
echo$sql;
}
if($conn->query($sql)==TRUE){
echo“剩余更新天数”;
}否则{
mysqli_错误($conn);
echo“Error:”.$sql.“
”$conn->Error; }
为此:

foreach ($pieces as $key => $value) {
  $val = explode (":", $value);
  $sql = "INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('$val[0]','$val[1]');";
echo $sql;

  if ($conn->query($sql) === TRUE) {
     echo "Days left updated";
  } else {
    mysqli_error($conn);
      echo "Error: " . $sql . "<br>" . $conn->error;
  }
}
foreach($key=>$value){
$val=分解(“:”,$value);
$sql=“插入到`redtable`(`IGNAME`,`IGPASS`)值('$val[0]','$val[1]');”;
echo$sql;
if($conn->query($sql)==TRUE){
echo“剩余更新天数”;
}否则{
mysqli_错误($conn);
echo“Error:”.$sql.“
”$conn->Error; } }

除此之外,您的代码还有许多问题,但这应该可以解决您提出的问题。

对于您当前的代码,它不应该插入任何内容。你需要向我们展示更多的代码。猜测:因为你在循环之外执行查询,所以它将只包含上一个SQL语句中的最后一个值。你的循环设置你的代码当前的状态是一个很大的安全风险。你是在环内还是环外插入?如果在外部,那么您总是覆盖$sql,所以只使用最后一个值。如果:foreach{$sql=..},它怎么可能在循环之外???它在循环中你是第一个给我一个例子,我不在循环中,谢谢你!我马上就去试试!你是个了不起的人!这个代码工作起来很有魅力。谢谢你的解释!关键是要理解,在使用代码时,您只是设置了一个变量,然后覆盖了一个变量—您的SQL—而不是写入数据库。有一次,在循环之外,SQL变量的最后一个编写版本发生了这种情况。嘿,我能问你一个离题的问题吗?如何将两个不同数组中的两个值求和,并将结果赋给变量?我一直得到0结果,sample$arr1[1]//等于10$arr2[1]//等于20;当我做$sum=$arr1[1]+$arr2[1]//我得到的是10,而不是30。为什么?在谷歌上找不到答案,实际上,搜索大约1.5小时。Stackoverflow阻止我提问。
foreach ($pieces as $key => $value) {
  $val = explode (":", $value);
  $sql = "INSERT INTO `redtable`(`IGNAME`,`IGPASS`) VALUES('$val[0]','$val[1]');";
echo $sql;

  if ($conn->query($sql) === TRUE) {
     echo "Days left updated";
  } else {
    mysqli_error($conn);
      echo "Error: " . $sql . "<br>" . $conn->error;
  }
}