gpt4 book ai didi

php - 在 PHP 中向 MySQL 插入多行(单个查询): Prepare-Execute vs. 准备-绑定(bind)-执行

转载 作者:行者123 更新时间:2023-11-29 12:14:37 25 4
gpt4 key购买 nike

我正在编写一些 PHP 来接受 POST 中的数字和名称数组,并将它们插入到 MySQL 表中(名为 Contacts_table )这是运行良好且没有任何错误的版本:

<?php

// Includes
require_once 'Admin/Connector.php';

// Test if payload exists
if($_POST){

// Read payload into arrays
$ar = 0;
foreach($_POST as $entry){
$namenum = explode(',', $entry);
$names[$ar] = $namenum[1];
$numbers[$ar] = $namenum[0];
$ar += 1;
}
$namenum = NULL;

// Build SQL query
$sql = 'INSERT INTO Contact_table (NAME, PHONE) VALUES ';
$insertQuery = array();
$insertData = array();
$n = 0;
foreach ($numbers as $num) {
$insertQuery[] = '(?, ?)';
$insertData[] = $names[$n];
$insertData[] = $num;
$n++;
}
$sql .= implode(', ', $insertQuery);
$sql .= ' ON DUPLICATE KEY UPDATE name = COALESCE(VALUES(name), name);';
$n = NULL;
$num = NULL;

// Connect to MySQL database
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);

// Execute SQL query
$query = $connect->prepare($sql);
$query->execute($insertData);
$insertQuery = NULL;
$insertData = NULL;
$sql = NULL;
$query = NULL;

// Close connection to MySQL database
$connect = NULL;

}

?>

但是,正如您所看到的,我在这里没有使用 bindParam() 函数,而是直接将值提供给 execute() 函数。许多人建议我使用 bindParam() 来提高服务器性能。这是真的吗?还是说这个项目目前的情况对我来说更好?我确实尝试使用bindParam编写并运行上述代码的一个版本:

<?php

// Includes
require_once 'Admin/Connector.php';

// Test if payload exists
if($_POST){

// Read payload into arrays
$ar = 0;
foreach($_POST as $entry){
$namenum = explode(',', $entry);
$names[$ar] = $namenum[1];
$numbers[$ar] = $namenum[0];
$ar += 1;
}
$namenum = NULL;

// Build SQL query
$sql = 'INSERT INTO Contact_table (NAME, PHONE) VALUES ';
$insertQuery = array();
$insertData = array();
$n = 0;
foreach ($numbers as $num) {
$insertQuery[] = '(?, ?)';
$insertData[] = $names[$n];
$insertData[] = $num;
$n++;
}
$sql .= implode(', ', $insertQuery);
$sql .= ' ON DUPLICATE KEY UPDATE name = COALESCE(VALUES(name), name);';
$n = NULL;
$num = NULL;

// Connect to MySQL database
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);

// Prepare SQL query
$query = $connect->prepare($sql);

// Bind variables
foreach($insertData as $key => &$ins) {
$connect->bindParam($key+1,$ins);
}

// Execute SQL query
$query->execute();
$insertQuery = NULL;
$insertData = NULL;
$sql = NULL;
$query = NULL;
$key = NULL;
$ins = NULL;

// Close connection to MySQL database
$connect = NULL;

}

?>

但是此代码拒绝运行并返回 fatal error - 调用未定义的方法 PDO::bindParam()。我在这里做错了什么?我知道如果我在循环中包含 execute() ,则可以编写更简单的代码,但这会产生多个查询,我想不惜一切代价避免这些查询。无论如何,我的目标是单个查询。

最佳答案

您不能$connect->bindParam($key+1,$ins);。因为PDO对象没有这样的方法。只有 PDOStatement 有。这就是您收到错误消息的原因。

你应该:

 $query->bindValue($key+1,$ins);

并且您应该使用bindValue,因为如果没有,所有插入的值都将获得相同的值(调用execute之前$ins的最后一个值)。

关于php - 在 PHP 中向 MySQL 插入多行(单个查询): Prepare-Execute vs. 准备-绑定(bind)-执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30037818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com