php - bind_param inside foreach() not correctly passing

不打扰是莪最后的温柔 提交于 2020-07-22 10:23:11

问题


I'm sure this is a duplicate, but I've tried several different things on the site here and none of them are working for me. I'm calling my function in php, sending $mysqli connection, the $clientID, and the array of $tagFields to upload.

It's 'working', but the values are always null. I've put echo "$tagName" inside the foreach, and it's reading it, but not sending it up to the database. $clientID, however, IS passing information. So basically all it does is upload consistently blank rows into my database. What am I doing wrong here?

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();
    }
}

some sample values for $tagFields:

$tagFields[0] = "Regional";$tagFields[1] = "Automotive";$tagFields[2] = "Maintenance";

回答1:


Note mysqli_stmt::bind_param bind the reference of the variables. Try the below:

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();
    }
}



回答2:


execute() shouldn't be situated inside the foreach.




回答3:


Among with a myriad of problems associated with the database (including the client_id being the primary key), I've rebuilt the formula like this:

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
        }
    }
}

This formats to something like this:

INSERT INTO client_tags (client_id,tag) VALUES ('1234','mechanical'),('1234','regional'),('1234','service') ON DUPLICATE KEY UPDATE client_id = '1234';

The ON DUPLICATE part is important because for some reason the client_id is set to primary key. I'm gonna have to talk to the app guys and see if this matters to them.

Unfortunately, bind_param isn't being used, but this is a admin panel access only for company employees only, and now that this is working I'm giving them autocomplete boxes to reference existing values.



来源:https://stackoverflow.com/questions/15775864/php-bind-param-inside-foreach-not-correctly-passing

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!