Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将我的PHP foreach循环SQL插入更改为准备好的语句SQL循环?_Php_Mysqli_Foreach_Prepared Statement_Sql Insert - Fatal编程技术网

如何将我的PHP foreach循环SQL插入更改为准备好的语句SQL循环?

如何将我的PHP foreach循环SQL插入更改为准备好的语句SQL循环?,php,mysqli,foreach,prepared-statement,sql-insert,Php,Mysqli,Foreach,Prepared Statement,Sql Insert,我有一个循环查询要插入MySQL数据库,它可以完美地完成我需要它做的事情,因为它接受数组中的所有用户输入,然后循环它们,并将每个用户输入到数据库中他们自己的行中 $sql_insert_race_history = "INSERT INTO inf_race_history (`inf_id`,`race_history`, `results`) VALUES ";

我有一个循环查询要插入MySQL数据库,它可以完美地完成我需要它做的事情,因为它接受数组中的所有用户输入,然后循环它们,并将每个用户输入到数据库中他们自己的行中

$sql_insert_race_history = "INSERT INTO inf_race_history 
                                    (`inf_id`,`race_history`, `results`) 
                            VALUES ";

if ($vracehistory != '') {
    foreach ($vracehistory as $kay => $value) {
        // $sql .= '' | $sql = $sql . '';
        $sql_insert_race_history .= "('$inserted_id','{$value}','{$results[$kay]}'),";
    }
} else {
    $vracehistory = '';
}
// remove last `,` into query;
$sql_insert_race_history = rtrim($sql_insert_race_history, ',');
$countRow = count($_POST['racehist']);
//INSERT INTO THE DATABASE VIA QUERY
$results_racehistory = mysqli_query($vconn, $sql_insert_race_history);
这段代码可以正常工作并插入我需要的所有内容,但是我被告知它容易受到SQL注入攻击,因此我一直在尝试通过使用准备好的语句来防止这种情况。我尝试的每个版本都会循环“不起作用”,它只上载数组中的最后一项

$stmtrace = $conn->prepare("INSERT INTO inf_race_history 
                                   (`inf_id`,`race_history`, `results`) 
                            VALUES (?,?,?)");
if ($vracehistory != '') {
    foreach ($vracehistory as $kay => $value) {
        $stmtrace->bind_param("sss", $inserted_id,$value,$results[$kay]);
    }
} else {
    $vracehistory = '';
}
// remove last `,` into query;
$sql_insert_race_history = rtrim($stmtrace, ',');
$countRow = count($_POST['racehist']);
//INSERT INTO THE DATABASE VIA QUERY
$stmtrace->execute();

我认为这可能与将foreach循环中的
=
更改为仅
->bind_param
有关,因为这可能会剥夺循环它的机会?虽然我不太确定,也不知道我该如何回显我试图回显
$stmtrace
但它说
方法\u tostring没有实现
您应该将execute()放在循环内。

您应该将execute()放在循环内。

将参数绑定到foreach循环外,并在分配foreach循环内的变量时分配和执行查询。比如说

$stmtrace->bind_param("sss", $insertId, $insertValue, $insertKey);
foreach ($vracehistory as $kay => $value) {
    $insertId = inserted_id;
    $insertValue = $value;
    $insertKey = $kay;
    $stmtrace->execute();
}

另一个注意事项是,如果绑定一个整数,bind_param方法的值应该是“i”。

将参数绑定到foreach循环外部,并在为foreach循环内部的变量赋值时赋值并执行查询。比如说

$stmtrace->bind_param("sss", $insertId, $insertValue, $insertKey);
foreach ($vracehistory as $kay => $value) {
    $insertId = inserted_id;
    $insertValue = $value;
    $insertKey = $kay;
    $stmtrace->execute();
}
foreach ($vracehistory as $kay => $value) {
    $stmtrace->bind_param("sss", $inserted_id, $value, $results[$kay]);
    $stmtrace->execute();
}

另一个注意事项是,如果绑定一个整数,bind_param方法的值应该是“i”。

该代码有很多错误。首先,每次都要准备并执行查询,但只有当
$vracehistory
不为空时才绑定参数。此外,您不能
rtrim()
a语句。该语句不是字符串。然后你需要在绑定新变量之前执行这个语句。这段代码有很多错误。首先,每次都要准备并执行查询,但只有当
$vracehistory
不为空时才绑定参数。此外,您不能
rtrim()
a语句。该语句不是字符串。那么你需要在绑定新变量之前执行该语句。好的,我现在就试试,让你知道,我是否也把其他信息放在循环中?除非我可能做错了什么,否则不起作用,但我把
execute()
放在循环
if($vracehistory!='')中{foreach($vracehistory as$kay=>$value){$stmtrace->bind_param(“sss”),$inserted_id,$value,$results[$kay]);$stmtrace->execute();}}否则{$vracehistory='';}
嘿,我看到它确实起作用了,Kabir告诉我,当我复制他的时它起作用了,所以我想我可能只是有点小错误。你是对的,好的,我现在试试,让你知道,我是否也将其他信息放在循环中?除非我可能做错了,但我把
execute()
循环内部
if($vracehistory!=''){foreach($vracehistory as$kay=>$value){$stmtrace->bind_param(“sss”),$inserted_id,$value,$results[$kay]);$stmtrace->execute();}否则{$vracehistory=''}
嘿,我看到它确实起作用了,Kabir告诉我,当我复制他的时它确实起作用了,所以我想我可能只是有点小错误。你是对的hey@kezufru,这很有意义,我看到我在循环中进行了绑定,声明绑定,然后循环值,这只是其中的一个问题,第二个值是
$insertKey=$kay
实际上并不反映在数据库中,它只是显示为0或1或2,这取决于我实际输入到数据库中的输入数量。因此,如果我输入2,那么第一个得到0,第二个得到1hey@kezufru,这是有道理的,我看到我在循环中进行了绑定,而不是声明绑定,然后循环值,只是一个问题但是,第二个值,
$insertKey=$kay
实际上并没有反映在数据库中,它只是显示为0或1或2,这取决于我实际输入到数据库中的输入数量,所以如果我输入了2,那么第一个值得到0,第二个值得到1。我可以问你什么时候应该关闭到
stmt
$conn的连接吗
?我可以问您什么时候应该关闭与
stmt
$conn
的连接吗?
foreach ($vracehistory as $kay => $value) {
    $stmtrace->bind_param("sss", $inserted_id, $value, $results[$kay]);
    $stmtrace->execute();
}