Php 从POST复选框值对数组使用preg_匹配

Php 从POST复选框值对数组使用preg_匹配,php,arrays,checkbox,preg-match,Php,Arrays,Checkbox,Preg Match,我遇到的问题是如何使preg_match对从表单返回的数组正确工作 <input type="checkbox" name="receiver-check[]" class="checkbox-id" value="Username 1 (123)"> <input type="checkbox" name="receiver-check[]" class="checkbox-id" value="Username 2 (456)"> <input type="ch

我遇到的问题是如何使preg_match对从表单返回的数组正确工作

<input type="checkbox" name="receiver-check[]" class="checkbox-id" value="Username 1 (123)">
<input type="checkbox" name="receiver-check[]" class="checkbox-id" value="Username 2 (456)">
<input type="checkbox" name="receiver-check[]" class="checkbox-id" value="Username 3 (789)">

因此,我希望对通过表单收到的值使用preg_match。 这就是我使用它的方式

$msg_receivers = !empty($_POST['receiver-check']) && is_array($_POST['receiver-check']) ? $_POST['receiver-check'] : array();
    $receiverIds = array();
    foreach($msg_receivers as $receiver) {
        $receiverIds[] = preg_replace('/\((\d+)\)$/', "$1", $receiver);
    }
    $number_of_receivers = count($receiverIds);
    $while_count = 0;
    while($number_of_receivers >= ($while_count + 1)){
        $sql = <<< EOF
        INSERT INTO private_messages (
        message_subject,
        message_content,
        message_deliver,
        message_receive,
        message_status,
        message_datetime,
        message_to_stab
        )VALUES
        (?,?,?,?,'2',?,?);
EOF;
        $stmt = $mysqli->prepare($sql) or die ("Feil i database<br>" . $sql . "<br><b>Feilmelding:</b> " . $mysqli->error);
        $stmt->bind_param("ssiiii",$message_subject,$message_content, $_SESSION['user_id'],$receiverIds[$while_count],$message_datetime,$message_to_stab);
        $stmt->execute() or die("noe gikk galt");
        $msg_num_rows = $stmt->num_rows;
        if($msg_num_rows = 0){
            $msg = "Feilmelding: Klarte ikke å sende meldingen.";
        }
        else{
            $msg = "Meldingen har blitt sendt.";
        }
        $stmt->free_result();
        $stmt->close();
        $while_count ++;
    }
$msg\u接收器=!空($_POST['receiver-check'])和&is_数组($_POST['receiver-check'])$_POST['receiver-check']:数组();
$receiverIds=array();
foreach($msg_receiver as$receiver){
$receiverIds[]=preg\u replace(“/\(\d+)$/”、“$1”、$receiver);
}
$number_of_receiver=计数($receiverid);
$while_count=0;
while($while计数+1)){
$sql=错误);
$stmt->bind_参数(“SSIII”、$message_subject、$message_content、$SESSION['user_id']、$receiverIds[$while_count]、$message_datetime、$message_to_stab);
$stmt->execute()或die(“noe gikk galt”);
$msg\u num\u rows=$stmt->num\u rows;
如果($msg\u num\u rows=0){
$msg=“Feilmelding:Klarte ikkeåsende meldingen。”;
}
否则{
$msg=“梅尔丁根和布莱特发送”;
}
$stmt->free_result();
$stmt->close();
$while_count++;
}
然后我使用
$msg\u receiver\u query
在while循环内的查询中指定一个值。
我当前在数据库中收到的是0和1。没有别的了。对于我来说,正确的
preg_match
是什么,以便只输出论文中的数字?有没有更有效的方法来解决我的这个问题呢?

你可以这样做

通过这种方式,您可以将其插入到数据库中。但您将查询数据库3次以插入3条记录

<?php

//use your connection Data
$user = "root";
$pass = "***";
$host = "localhost";
$dbdb = "TestDataBase";

$connect = mysqli_connect($host, $user, $pass, $dbdb);
if(!$connect)
{
    trigger_error('Error connection to database: '.mysqli_connect_error());
}

//check if receiver-check is set or not
if(isset($_POST['receiver-check'])){
      $msg_receivers = $_POST['receiver-check'];


      // iterate through $msg_receivers
      foreach($msg_receivers AS $value){
          preg_match_all("/([0-9]{3})/", $value, $msg_receiver_query);

            //Query, just change the table name and columns to what ever you need.
            $sql = "INSERT INTO `table` (`column1`) VALUES ('" .$msg_receiver_query[0][0] . "')";

            if (mysqli_query($connect, $sql)) {
                  echo 'Record(s) created successfully<br>';
            } else {
                  echo $sql . '"<br>"' . mysqli_error($connect);
            }
      }

}else{
      echo "nothing is set";
}
?>

可能有点高级,但您也可以在one查询中执行此操作

<?php

//use your connection Data
$user = "root";
$pass = "***";
$host = "localhost";
$dbdb = "TestDataBase";

$connect = mysqli_connect($host, $user, $pass, $dbdb);
if(!$connect)
{
    trigger_error('Error connection to database: '.mysqli_connect_error());
}

//check if receiver-check is set or not
if(isset($_POST['receiver-check'])){
      $msg_receivers = $_POST['receiver-check'];

      $inputArray = '';

      // iterate through $msg_receivers
      foreach($msg_receivers AS $value){
          preg_match_all("/([0-9]{3})/", $value, $msg_receiver_query);

          //insert all output in to an array
          $inputArray [] =  "('" . $msg_receiver_query[0][0] . "')";
      }

      //Insert all outputs in 1 query
      $sql = "INSERT INTO `testtable` (`column1`) VALUES " . implode(",",$inputArray) . "";

      if (mysqli_query($connect, $sql)) {
            echo 'Record(s) created successfully<br>';
      } else {
            echo $sql . '"<br>"' . mysqli_error($connect);
      }

}else{
      echo "nothing is set";
}
?>

看起来您不想匹配,您只想提取每个
$\u POST['receiver-check']
值的一部分-因此
preg\u replace()
将是正确的函数

$msg_receivers = !empty($_POST['receiver-check']) && is_array($_POST['receiver-check']) 
             ? $_POST['receiver-check'] : array();

$receiverIds = array();

foreach($msg_receivers as $receiver) {
  $receiverIds[] = preg_replace('/^.*\((\d+)\)$/', "$1", $reciever);
}
这将为您提供一系列接收者ID($ReceiverID),如:


除了编写循环的方式有点奇怪之外,您还忽略了RegExp中的模式边界:一个简单的
/\(\d+\)$/
应该可以
foreach($sReceiverValue为msg_receivers){…}
。。。我会验证
$\u POST['receiver-check']
以及
!empty()
是_array()
只是为了安全起见。我仍然在数据库中得到1作为输出。我们可以聊天吗?即使我在我的名字中使用receiver check[],这也算数吗?你为什么不试试呢?我有。我的数据库中有0。我只是将其输出到您的浏览器中。这不会在您的数据库中插入任何内容。只需编辑您的问题并向我们显示您的查询。用查询更新了我的答案,这只是一个示例查询,您需要更改它以适应您的情况。我给了你两个选项:多个查询或仅一个查询。我如何将其绑定到一个查询?我想$ReceiverID[0]应该是=123和2=456?差不多-但是如果使用绑定参数,则需要通过引用传递变量。。。如果您使用的是PDO,则可以使用
bindValue()
来代替。我尝试了您的解决方案。当选择receiver check时,我仅在数据库中获取0。怎么会?复选框名为
receiver check[]
你找到了吗?它正在工作!谢谢!:)我已经花了很多时间在这上面了!
array(
  [0] => 123, 
  [1] => 456, 
  [2] => 789
  );