Php Foreach循环只返回一个值,mysqli_insert返回0

Php Foreach循环只返回一个值,mysqli_insert返回0,php,mysql,foreach,Php,Mysql,Foreach,我是编程新手,需要foreach循环和外键的帮助。 下面我尝试向多个用户发送一条消息。一个查询将输入消息表,另一个查询将输入收件人表 我的问题: 我的foreach循环在recipients表中只创建一个条目,并且只返回数组中最后一个用户id 使用mysqli_insert_id,我无法获取消息id(来自消息表的主键)。 当前它正在返回0 任何帮助都将不胜感激 $connection = new mysqli($host_name, $host_user, $host_password, $da

我是编程新手,需要foreach循环和外键的帮助。 下面我尝试向多个用户发送一条消息。一个查询将输入消息表,另一个查询将输入收件人表

我的问题: 我的foreach循环在recipients表中只创建一个条目,并且只返回数组中最后一个用户id

使用mysqli_insert_id,我无法获取消息id(来自消息表的主键)。 当前它正在返回0

任何帮助都将不胜感激

$connection = new mysqli($host_name, $host_user, $host_password, $database_name);

$json = json_decode(file_get_contents('php://input'), true);

$recipients = array(1000005,1000006,1000007);
$query = "INSERT INTO messages(message_content, message_subject, from_id) values('$json[message_content]', '$json[message_subject]', '$json[from_id]')";
$message_id=mysqli_insert_id($connection);

foreach($recipients as $recepient){
$sql = "INSERT INTO recipients(message_id, user_id, message_content, message_subject, from_id) values($message_id, $recepient, '$json[message_content]', '$json[message_subject]', '$json[from_id]')";}

$query_result = $connection->query($query);
$sql_result = $connection->query($sql);
我相信错误在于不知何故结束了我的循环。
再次感谢你

我使用PHP数据对象而不是MySQLi重写了您的代码。 当从用户输入生成任何查询时,您应该将它们参数化,而不是将它们直接传递到字符串中(脚本中提到的注释容易受到SQL注入的攻击)

id没有返回值,因为您在执行insert语句之前正在获取它。在调用获取最后一个id之前移动第一个insert应该可以纠正此问题

foreach循环只对一个条目起作用,因为您在循环中重写了$sql变量,然后在之后执行它

将该查询的执行移动到循环中,每次都将运行该查询

$connection = new PDO('mysql:host=' . $host_name . ';dbname=' . $database_name, $host_user, $host_password);
$json = json_decode(file_get_contents('php://input'), true);
$recipients = array(1000005,1000006,1000007);
$query = "INSERT INTO messages(message_content, message_subject, from_id) values(:content, :subject, :from_id)";
$params = [
    'content' => $json['message_content'], 
    'subject' => $json['message_subject'],
    'from_id' => $json['from_id']
];

$statement = $connection->prepare($query)->execute($params);
$message_id = $connection->lastInsertId();;

foreach ($recipients as $recepient){
    $sql = "INSERT INTO recipients(message_id, user_id, message_content, message_subject, from_id) values(:message_id, :recepient, :message_content, :message_subject, :from_id)";
    $params = [
        'message_id' => $message_id,
        'recepient' => $recepient,
        'message_content' => $json['message_content'],
        'message_subject' => $json['message_subject'],
        'from_id' => $json['from_id'],
    ];

    $sql_result = $connection->prepare($sql)->execute($params);
}

首先,你给我们的是一个语法错误;循环没有闭合括号。与其浪费时间诊断您提到的问题,我强烈建议您后退一步,纠正一个可能解决您当前问题的不同问题。我建议研究pdo而不是mysqli,并通读
[本pdo教程](https://phpdelusions.net/pdo)
太棒了,谢谢。我真的很感激,谢谢你。我以前没有意识到这一点。非常感谢您的帮助,也感谢您花时间转换此文件。这是超越一切的。我们通常不会将代码转换成不同的API。您也可以使用MySQLi编写参数化的准备语句。