Добавление массива в БД в цикле с помощью подготовленного запроса

ksnk

прохожий
сдаётся мне, bind_param использован не по назначению...
тут в примерах всё проще
Принципиальный момент в этой задаче - неопределенное, вообще говоря, число параметров. Тоесть физически невозможно вызвать bind_param в том виде, как он используется в примерах. Приходится извращаться с call_user_array и натыкаться на "необходимо использовать ссылки, а не значения". Отсюда все эти странные маневры...
$stmt->execute(array_values($param));
же
:oops:, и действительно...
 

littus

Новичок
просто для информации:
твоя функция, почищенная от ненужного и вредного мусора:

PHP:
    public function f_saveMail($email_to, $theme, $text_email, $dt) {
            $sql = "INSERT INTO outboxes(email, theme, text, datetime) VALUES(?,?,?,?)";
            $stmt->prepare($sql);
            $stmt->bind_param("sssi", $email_to,$theme,$text_email,$dt);
            $stmt->execute();
    }
Можешь задать вопросы, если какие-то удаления кажутся тебе лишними.
Нет, я понял. То, что я погрузил в данном случае тело метода в блок try- catch,- это по-сути бессмысленно и даже избыточно. Я уже понял, - этот блок не для отлова/ оседания ошибок, php и так выдаст ошибку если чёё), я ничего этим не добиваюсь просто. Тем более, что даже, ежели ошибку туда совать, то все равно я ее не обрабатываю никак.
В общем тут более-менее понятно.
-----------------------
По своему топику. Спс, я переделал да, именно структуру таблицы, добавил поле с меткой(флажком),- соответственно по нему показываю или не показываю удаленное письмо. Так,конечно удобнее и проще. Однако я себе логику какую задумал: вот у меня есть письма, они рассортированы на ВХОДЯЩИЕ/ ИСХОДЯЩИЕ и КОРЗИНА. Если удаление делается из списка ВХОДЯЩИЕ/ ИСХОДЯЩИЕ - то для скрипта это не удаление, а перемещение в КОРЗИНУ, чтобы Юзер мог восстановить (ну как обычно делается).А вот если та же кнопка "УДАЛИТЬ" нажата из КОРЗИНЫ писем,- то идет безвозвратное удаления из БД.
Может не допонимаю как сделать грамотно, но что так я делал дополнительно
$sql = "INSERT INTO trashboxes SELECT id, name, email, theme, text, datetime FROM $name_table WHERE id IN ($id_string)";

выбранных писем для перемещения в КОРЗИНУ, что по доп полю с флажком приходится. Т.к. в данном случае я не просто хочу скрыть и не выводить то или иное письмо(ма), а именно удалить их из БД.
Как в таких случаях тогда более грамотно поступить?
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Ты определись, возвратное оно, или безвозвратное.
Если безвозвратное, то УДАЛЯЙ.
А если возвратное, то при перемещении в корзину ставь флаг корзина. А при удалении из корзины ставь флаг удалено из корзины.
 

полудух

Итсист
Принципиальный момент в этой задаче - неопределенное, вообще говоря, число параметров.
Я, честно говоря, не совсем понял, почему так не написать:
PHP:
$param = array('param1'=>1,'param2'=>2,'param3'=>4,'param4'=>4,'param5'=>'Hello!');
$where = array();
foreach($param as $key=>$val){$where[] = " AND `".$key."`='".$val."'";}
$query = "select * from `table`";
if(sizeof($where) > 0){$query .= " WHERE ".substr(implode($where),5);}
$mysqli->query($query);
?
 

ksnk

прохожий
Это неспортивно ;) Это читерство. По условиям задачи - требовалось через задницу с помощью подготовленных запросов и плейсхолдеров-вопросиков. (здесь не хватает смайлика с демоническим смехом)
Хотя, смысла строить sql с плейсхолдерами, а потом его обязательно препарировать, конечно, не особо много. Разве что данные в обязательном порядке будут заэскейплены.
 

Фанат

oncle terrible
Команда форума
Знание немногих принципов избавляет от необходимости знать многие факты.
Ну вот ты, например, не знаешь принципов защиты от SQL инъекций.
Это избавляет тебя от необходимости писать осмысленные реплики.
 

Фанат

oncle terrible
Команда форума
Хотя, смысла строить sql с плейсхолдерами, а потом его обязательно препарировать, конечно, не особо много. Разве что данные в обязательном порядке будут заэскейплены.
Ну, это не "разве что". Это то, ради чего все затевалось.

Вообще, mysqli - это тонкая-тонкая надстройка над функциями mysql API. позволяет множество тонкостей - такие как пинг, статус соединения, асинхронные запросы, и куча сего прочего.
При этом чисто по функционалу предоставляет только базовый набор функций.

Это как с курлом. чтобы пользоваться, надо написать свой враппер. Который скрывает кучу мелких вызовов и позволяет получить результат в один два вызова.

К ПДО у меня только одна жгучая претензия - execute не возвращает $this.
Тогда можно было бы писать

PHP:
return $pdo->prepare("SELECT name FROM users WHERE id=?")->execute([$id])->fetchColumn();
 

Фанат

oncle terrible
Команда форума
Я таки заморочусь и напишу враппер, попутно с переделкой сайта.
Ибо меня эта "мелочь" достала уже неимоверно.
http://phpfaq.ru/pdo_wrapper подойдет?

Я пробовал добавить возвращение $this, но потом подумал, что все равно сишком длинный код.
поэтому тупо добавил функцию run()
 

AnrDaemon

Продвинутый новичок
Мне достаточно часто надо именно выполнить один запрос с одним и тем же количеством параметров несколько раз. Рассылка, загрузка товара - самые часто встречающиеся задачи. Приходится дозировать работу и следить за временем, ибо локи мне не удалось заставить работать надёжно на NFS, БД иногда отваливается, так что локи на транзакциях тоже не держатся, а городить мемкеш пока не хочу.
 

Фанат

oncle terrible
Команда форума
Мне достаточно часто надо именно выполнить один запрос с одним и тем же количеством параметров несколько раз.
Тогда я не понимаю, зачем тебе враппер.
ПДО идеально заточен под такие задачи.
Запрепарил запрос, а потом сколько надо вызвал екзек.
 

AnrDaemon

Продвинутый новичок
Напрягает, когда этого НЕ надо. Приходится думать, использовать тут враппер или нет.
Ну ленивый я!
 

Фанат

oncle terrible
Команда форума
Напрягает, когда этого НЕ надо. Приходится думать, использовать тут враппер или нет.
Ну ленивый я!
Ты не ленивый, а привередливый.
Я дал тебе враппер, который делает РОВНО ТО что тебе нужно:
- МАКСИМАЛЬНО сокращает код, если не нужно возиться с препар/ехекут
- при этом на 100% сохраняет этот функционал, если он нужен
Что ясно видно из примеров.

Ты вообще туда заходил?
 
Сверху