[英]PHP mysqli insert command
我试图通过数组将多个值插入MySQL,但是它不起作用或传递错误消息,所以我不确定我要去哪里。 任何帮助,将不胜感激。
这是我调用函数的地方
$testArrayList = array();
$testArrayList[] = 'Account_idAccount';
$testArrayList[] = 'firstName';
$testArrayList[] = 'lastName';
$testArrayValues = array();
$testArrayValues[] = $idAccount;
$testArrayValues[] = $firstName;
$testArrayValues[] = $lastName;
$dbManager->insertValues("User", $testArrayList, $testArrayValues);
现在,这是被调用的insertValues函数。
public function insertValues($table, $cols, $values) {
foreach ($cols as $col)
$colString .= $col.',';
foreach ($values as $value)
{
$valueAmount .= '?,';
$valueType .= 's';
$valueParam .= $value.",";
}
$colString = substr($colString, 0, -1);
$valueAmount = substr($valueAmount, 0, -1);
$valueParam = substr($valueParam, 0, -1);
$mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);
$sql = "INSERT INTO $table ($colString) VALUES($valueAmount)";
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare($sql))) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
print_r($valueParam);
/* Prepared statement, stage 2: bind and execute */
if (!$stmt->bind_param("$valueType", $valueParam)) {
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
/* explicit close recommended */
$stmt->close();
$mysqli->close();
}
那里有很多错误,这是应该起作用的重写后的版本:
public function insertValues($table, array $cols, array $values) {
$mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);
$colString = implode(', ', $cols); // x, x, x
$valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ?
$sql = "INSERT INTO $table ($colString) VALUES($valString)";
if (!$stmt = $mysqli->prepare($sql))
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
foreach ($values as $v)
if (!$stmt->bind_param('s', $v))
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
if (!$stmt->execute())
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
$stmt->close();
$mysqli->close();
}
您还应该在构造函数中而不是为每个方法初始化一次mysqli连接:
public function __construct() {
$this->mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);
}
public function __destruct() {
$this->mysqli->close();
}
创建一个适当的函数来处理这些错误也很好,例如:
public function showError($message, object $obj) {
echo "$message: (" . $obj->errno . ") " . $obj->error;
}
导致此功能更清洁:
public function insertValues($table, $cols, $values) {
...
if (!$stmt = $mysqli->prepare($sql))
$this->showError("Prepare failed", $mysqli);
foreach ($values as $v)
if (!$stmt->bind_param('s', $v))
$this->showError("Binding parameters failed", $stmt);
if (!$stmt->execute())
$this->showError("Execute failed", $stmt);
...
}
我已经重写了该函数,因此您可以清楚地知道为什么错误使用bind_param()。
这个版本只是一个例子,只能使用2个cols!
function insertValues($table, array $cols, array $values) {
$mysqli = new mysqli('localhost', 'petr', null,'test');
$colString = implode(', ', $cols); // x, x, x
$valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ?
$sql = "INSERT INTO $table ($colString) VALUES($valString)";
if (!$stmt = $mysqli->prepare($sql))
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
list($a,$b) = $values;
// params $a and $b must exists during $stmt execution, therefore you can't use foreach with temproray variable
if (!$stmt->bind_param('ss', $a, $b))
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
if (!$stmt->execute())
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
$stmt->close();
$mysqli->close();
}
这有效:
insertValues('test',array('firstName','lastName'),array('Jan Amos','Komensky'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.