MYSQLI подготовил заявление об обновлении заявления с указанием, где в массиве

#php #mysqli #prepared-statement

Вопрос:

Мне удалось создать подготовленный оператор, который обновляет жестко закодированные значения в таблице базы данных SQL, используя подготовленный оператор mysqli с оператором Where IN, который содержит массив..

Мне нужно обновить stats_accid столбец таблицы resetstats значением $arrayresetid из учетной записи таблицы на основе выбранных имен в переменной $arrayresetname , которые хранятся в username столбце таблицы resetstats .

Вот мой код:

 if ($totalacc > 0) {
    $in7 = str_repeat('?,', count($arrayidc) - 1) . '?';
    $types7 = str_repeat('s', count($arrayidc));
    $sql7 = "SELECT email,name,group_name,id FROM account WHERE name IN ($in7) AND NOT group_name = 'test'";
    $stmt7 = $mysqli->prepare($sql7);
    $stmt7->bind_param($types7, ...$arrayidc);
    $stmt7->execute();
    $result7 = $stmt7->get_result();
    while ($rowid7 = $result7->fetch_assoc()) {
        $arrayresetid = $rowid7['id'];
        $arrayresetname = $rowid7['name'];
        $arrayresetnamereplace = str_replace(" (resetted)", "", $arrayresetname);
        $arraynamereset[] = $arrayresetnamereplace;
    }

    if ($stmt7 == true) {
        $in9 = str_repeat('?,', count($arraynamereset) - 1) . '?';
        $sql9 = "UPDATE resetstats SET statsfriendly = 1,stats_accid = ? WHERE username IN ($in9) ";
        $stmt9 = $mysqli->prepare($sql9);
        $arraynamereset[] = $arrayresetid;
        $stmt9->bind_param(str_repeat('s', count($arraynamereset)), ...$arraynamereset);
        $stmt9->execute();
        $stmt9->close();
    }
}
 

Пример учетной записи таблицы данных:

 id | name
865 | test name a
876 | test name b
888 | test name c
 

пример таблицы данных resetstats (перед обновлением !):

 statsid | username | statsfriendly | stats_accid
2 | test name a | 0 | 0
3 | test name b | 0 | 0
4 | test name c | 0 | 0
 

пример таблицы данных resetstats (Ожидаемый вывод ПОСЛЕ обновления !):

 statsid | username | statsfriendly | stats_accid
2 | test name a | 1 | 865 
3 | test name b | 1 | 876 
4 | test name c | 1 | 888
 

Комментарии:

1. На самом деле не совсем ясно, в чем проблема. Может быть, если бы вы показали, что вы пытаетесь сделать, на небольшой выборке данных?

2. Мне нужно использовать переменную в этом подготовленном заявлении. ОБНОВИТЕ значения сброса, УСТАНОВИТЕ statsfriendly = 1,stats_accid = ? ГДЕ имя пользователя В ($in9) . Переменная, которую я использую сейчас, не обновляет идентификатор из учетной записи таблицы в таблице resetstats . Я понятия не имею, как сделать из этого пример ?

3. Если вы включите обработку ошибок mysqli, вы, вероятно, обнаружите, что ваш последний параметр bind_param не работает, потому что количество параметров, которые вы ему задаете, не соответствует количеству ? s в запросе. stats_accid = ? Я думаю, вы забыли о параметре. Или, возможно, вы не забыли об этом, но вы поместили это в конец $arraynamereset , а не в начало, где это должно быть. Я предполагаю $arraynamereset[] = $arrayresetid; , что предполагалось добавить этот параметр? Так что, возможно, на самом деле ошибка будет ошибкой несоответствия типов в SQL. Кроме того, он будет использовать только последнее значение $arrayresetid !

4. Почему вы делаете это с двумя запросами? Вы можете сделать это с UPDATE помощью запроса, который соединяется с account таблицей.

5. $arrayresetid это просто идентификатор из последней строки, возвращенный SELECT запросом. Вы UPDATE установите для каждого stats_id набора один и тот же идентификатор.

Ответ №1:

Вы должны сделать это с помощью одного запроса.

 UPDATE resetstats AS r
JOIN account AS a ON r.username = REPLACE(a.name, ' (resetted)', '')
SET r.statsfriendly = 1, r.stats_id = a.id
WHERE a.name IN ($in7)
 

Комментарии:

1. Спасибо! Никогда не знал, что sql можно сделать так!