php - bind_param里面的foreach()没有正确传递

时间:2013-04-02 22:52:32

标签: php foreach mysqli

我确定这是重复的,但我在网站上尝试了几种不同的东西,但没有一种能为我工作。我在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";

3 个答案:

答案 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没有被使用,但这只是一个管理面板访问权限,仅适用于公司员工,现在我正在使用它们自动完成框来引用现有值。