我确定这是重复的,但我在网站上尝试了几种不同的东西,但没有一种能为我工作。我在php中调用我的函数,发送$ mysqli连接,$ clientID和要上传的$ tagFields数组。
它正在“工作”,但值始终为空。我在foreach中放了echo“$ tagName”,它正在读取它,但不会将它发送到数据库。但是,$ clientID正在传递信息。所以它基本上只是将空白行一直上传到我的数据库中。我在这里做错了什么?
function tagRefresh($mysqli,$clientID,$tagFields) {
$stmt = $mysqli->stmt_init();
$query = "INSERT INTO client_tags (client_id,tag_category) VALUES (?,?) ";
$stmt->prepare($query);
foreach($tagFields as $tagName) {
$stmt->bind_param('is',$clientID,$tagName);
$stmt->execute();
}
}
$ tagFields的一些示例值:
$tagFields[0] = "Regional";$tagFields[1] = "Automotive";$tagFields[2] = "Maintenance";
答案 0 :(得分:1)
注意 mysqli_stmt::bind_param 绑定变量的引用。 试试以下内容:
function tagRefresh($mysqli,$clientID,$tagFields) {
$stmt = $mysqli->stmt_init();
$query = "INSERT INTO client_tags (client_id,tag_category) VALUES (?,?) ";
$stmt->prepare($query);
$stmt->bind_param('is', $clientID, $tagName);
foreach($tagFields as $tagName) {
$stmt->execute();
}
}
答案 1 :(得分:0)
execute()不应位于foreach内。
答案 2 :(得分:0)
除了与数据库相关的大量问题(包括client_id是主键)之外,我还重建了这样的公式:
function tagRefresh($mysqli,$clientID,$tagFields) {
$query = "DELETE FROM client_tags WHERE client_id = '" . $clientID . "'"; //we have to delete the old ones every time
if(!$mysqli->query($query)) {
echo $mysqli->error;
}
if($tagFields != '') { //see if data was sent
$tags = array();
foreach($tagFields as $tag) {
$tags[] = "('" . (int) $clientID . "', '" . $tag ."')"; //build an array
}
$query = "INSERT INTO client_tags (client_id,tag) VALUES " . implode(',', $tags) . " ON DUPLICATE KEY UPDATE client_id = " . $clientID;
if(!$mysqli->query($query)) {
echo $mysqli->error; //drop errors, will attach this later
}
}
}
格式如下:
INSERT INTO client_tags (client_id,tag) VALUES ('1234','mechanical'),('1234','regional'),('1234','service') ON DUPLICATE KEY UPDATE client_id = '1234';
ON DUPLICATE部分很重要,因为出于某种原因,client_id被设置为主键。我将不得不与应用程序人员交谈,看看这对他们是否重要。
不幸的是,bind_param没有被使用,但这只是一个管理面板访问权限,仅适用于公司员工,现在我正在使用它们自动完成框来引用现有值。