1

我确定这是重复的,但是我在这里的网站上尝试了几种不同的方法,但没有一种对我有用。我在 php 中调用我的函数,发送 $mysqli 连接、$clientID 和要上传的 $tagFields 数组。

它正在“工作”,但值始终为空。我已将 echo "$tagName" 放入 foreach 中,它正在读取它,但没有将其发送到数据库。但是,$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";
4

3 回答 3

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();
    }
}
于 2013-04-03T01:41:18.583 回答
-1

在与数据库相关的无数问题中(包括 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,但这是一个仅适用于公司员工的管理面板访问权限,现在这正在工作,我正在给他们自动完成框以引用现有值。

于 2013-04-03T01:08:17.420 回答
-1

execute() 不应位于 foreach 内。

于 2013-04-02T23:03:45.593 回答