Php foreach 循环仅在 mysql 检查重复项时添加第一行
Php foreach loop only adds first row in mysql when checking for duplicates
当用户在文本区域中输入多行时,我有一个页面。
$systemName = "MySystem";
// scandata is a textarea element
if(isset($_POST['submit'])) {
////////////
$rows = preg_split('/\n/',$_POST['scandata']);
foreach($rows as $row){
$data = preg_split('/\t/',$row);
if(count($data) == 6){
$sigID = $data[0];
$sigGroup = $data[1];
$sigType = $data[2];
$sigName = $data[3];
$sigScanStrenght = $data[4];
if (preg_match('/\b[A-Z][A-Z][A-Z]-[0-9][0-9][0-9]\b/', $sigID)){
if ($sigGroup == "22") {
if ($sigType == "11") {
if ($sigName == "") {
$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but signature ID <u>$sigID</u> is not scanned down enough. Please scan it to higher percentage.</div>\n";
}else {
//function VALIDATE
$validateSQL= "SELECT `id` FROM `signature` WHERE `sigName` = '$sigName' AND `systemName` = '$systemName' AND `sigID` = '$sigID' AND `already_run` = 'no'";
if ($validate_result=mysqli_query($con,$validateSQL))
{
// Return the number of rows in result set
$validate_rowcount=mysqli_num_rows($validate_result);
if ($validate_rowcount > 0){
$sql_to_add = false;
$add_action[] = "<div class=\"alert alert-warning fade in alert_me\">$button_x_close Sorry, but signature ID <u>$sigID</u> you entered is a duplicate</div>";}
else{
$sql_to_add = true;
$to_add_action = "<div class=\"alert alert-success fade in alert_me\">$button_x_close Succes signature ID <u>$sigID</u> has been added</div>";}
if($sql_to_add) {$sql = "INSERT INTO `signature` (`systemName`, `sigName`, `sigGroup`, `sigType`, `sigScanStrenght`, `reporter`, `sigID`)
VALUES ('$systemName', '$sigName', '$sigGroup', '$sigType', '$sigScanStrenght', '$reporter', '$sigID')";
if (!mysqli_query($con,$sql)) { die('Error: ' . mysqli_error($con)); }
}
else {$sql = "";}
$add_action[] = $to_add_action;
// Free result set
mysqli_free_result($validate_result);
mysqli_close($con);
}
}//else sigName close
}//if sigtype close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but signature type <u><b>$sigType</b></u> is not added</div> \n";}
}// if sigroup close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but signature ID <u>$sigID</u> has invalid signature group (<i> $sigGroup </i>)</div> \n";}
}//if pregmatch sigid close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but you entered invalid signature ID (<i> $sigID </i>)</div> \n";}
}//if count close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Bad data input. Make sure you pasted the result right.</div> \n";}
}//foreach close
}//main function close
问题是第一行是否成功。它只将第一行输入数据库。如果其他行不符合前面的 if 语句,它会打印出正确数量的错误。
我很确定我遗漏了 foreach 循环的一个要点,但我找不到它。
不胜感激。
编辑代码使其完整。
编辑:代码本身有效。问题是它只添加文本区域的第一行。
我数了 13 个左括号“{”和 9 个右括号“}”。如果问题真的出在 foreach 循环上,那就不是什么好事了。
感谢您修复括号不平衡问题并格式化代码以使其更易于阅读。
我没有你的测试数据集所以我不能确定,但在快速测试中
mysqli_close($con);
阻止我对连接进行其他查询。一旦你点击这条线,我认为所有额外的查询都会失败。报错了吗?我在后续查询中遇到了很多错误。
当用户在文本区域中输入多行时,我有一个页面。
$systemName = "MySystem";
// scandata is a textarea element
if(isset($_POST['submit'])) {
////////////
$rows = preg_split('/\n/',$_POST['scandata']);
foreach($rows as $row){
$data = preg_split('/\t/',$row);
if(count($data) == 6){
$sigID = $data[0];
$sigGroup = $data[1];
$sigType = $data[2];
$sigName = $data[3];
$sigScanStrenght = $data[4];
if (preg_match('/\b[A-Z][A-Z][A-Z]-[0-9][0-9][0-9]\b/', $sigID)){
if ($sigGroup == "22") {
if ($sigType == "11") {
if ($sigName == "") {
$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but signature ID <u>$sigID</u> is not scanned down enough. Please scan it to higher percentage.</div>\n";
}else {
//function VALIDATE
$validateSQL= "SELECT `id` FROM `signature` WHERE `sigName` = '$sigName' AND `systemName` = '$systemName' AND `sigID` = '$sigID' AND `already_run` = 'no'";
if ($validate_result=mysqli_query($con,$validateSQL))
{
// Return the number of rows in result set
$validate_rowcount=mysqli_num_rows($validate_result);
if ($validate_rowcount > 0){
$sql_to_add = false;
$add_action[] = "<div class=\"alert alert-warning fade in alert_me\">$button_x_close Sorry, but signature ID <u>$sigID</u> you entered is a duplicate</div>";}
else{
$sql_to_add = true;
$to_add_action = "<div class=\"alert alert-success fade in alert_me\">$button_x_close Succes signature ID <u>$sigID</u> has been added</div>";}
if($sql_to_add) {$sql = "INSERT INTO `signature` (`systemName`, `sigName`, `sigGroup`, `sigType`, `sigScanStrenght`, `reporter`, `sigID`)
VALUES ('$systemName', '$sigName', '$sigGroup', '$sigType', '$sigScanStrenght', '$reporter', '$sigID')";
if (!mysqli_query($con,$sql)) { die('Error: ' . mysqli_error($con)); }
}
else {$sql = "";}
$add_action[] = $to_add_action;
// Free result set
mysqli_free_result($validate_result);
mysqli_close($con);
}
}//else sigName close
}//if sigtype close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but signature type <u><b>$sigType</b></u> is not added</div> \n";}
}// if sigroup close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but signature ID <u>$sigID</u> has invalid signature group (<i> $sigGroup </i>)</div> \n";}
}//if pregmatch sigid close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Sorry, but you entered invalid signature ID (<i> $sigID </i>)</div> \n";}
}//if count close
else {$add_action[] = "<div class=\"alert alert-danger fade in alert_me\">$button_x_close <b>ERROR:</b> \t Bad data input. Make sure you pasted the result right.</div> \n";}
}//foreach close
}//main function close
问题是第一行是否成功。它只将第一行输入数据库。如果其他行不符合前面的 if 语句,它会打印出正确数量的错误。
我很确定我遗漏了 foreach 循环的一个要点,但我找不到它。
不胜感激。
编辑代码使其完整。
编辑:代码本身有效。问题是它只添加文本区域的第一行。
我数了 13 个左括号“{”和 9 个右括号“}”。如果问题真的出在 foreach 循环上,那就不是什么好事了。
感谢您修复括号不平衡问题并格式化代码以使其更易于阅读。
我没有你的测试数据集所以我不能确定,但在快速测试中
mysqli_close($con);
阻止我对连接进行其他查询。一旦你点击这条线,我认为所有额外的查询都会失败。报错了吗?我在后续查询中遇到了很多错误。