note 127012 added to mysqli-stmt.bind-param

From: Date: Tue, 26 Apr 2022 11:10:28 +0000
Subject: note 127012 added to mysqli-stmt.bind-param
Groups: php.notes 
Request: Send a blank email to php-notes+get-218317@lists.php.net to get a copy of this message
Понадобилась функция, которая вставляет ассоциативный массив в MySQL через prepare используя ключи массива в качестве полей. Функция решает проблему с параметрами mysqli_stmt_bind_param когда неизвестны типы вносимых данных и их количество. Работает так: <?php $data=array('имя_колонки'=>'вносимое_значение', 'имя_колонки2'=>'вносимое_значение2'); insert('имя_таблицы', $data); ?> Функция берет типы из таблицы MySQL, а не из ассоциативного массива <?php //функция вставки ассоциативного массива соответсвтующего колонкам в базу; нарпимер ['пароль'=>'1234','логин'=>'user'] function insert($tab, $data){//$data массив полей со значениями ['пароль'=>'1234','метка'=>'уера']; global $SQL;//получаем соединение с базой MySQL boolval(mysqli_query($SQL, "SHOW TABLES FROM {___base___} LIKE '$tab'")->num_rows) or exit('Таблица '.$tab.' не найдена'); $all_column=array_column(mysqli_fetch_all(mysqli_query($SQL, "SHOW COLUMNS FROM $tab"), MYSQLI_ASSOC), 'Type', 'Field'); //меняем тип поля например int(11) на i для запроса к базе array_walk($all_column,'change_type'); //получаем поля с типами которые используются в запросе $use_types=array_intersect_key($all_column, $data); //формируем types для запроса mysqli_stmt_bind_param() $str_types=implode($use_types);//например siss //формируем запроса к базе, можно переделать на "INSERT INTO tbl_name (question1,question2) VALUES(?,?) " $prepare=implode('=?,',array_keys($use_types)).'=?'; //упорядочиваем поля из дата $data с порядком в базе; так же отсеиваем несуществующие поля $data=array_values(array_replace($use_types, $data)); $ads = mysqli_prepare($SQL, "INSERT INTO Сервера SET $prepare"); mysqli_stmt_bind_param($ads, $str_types, ...$data); mysqli_stmt_execute($ads); } //функция преобразования типов полей базы в типы для запроса mysqli_stmt_bind_param function change_type(&$t){ $t= match (true){ str_contains($t, 'int') or str_contains($t, 'bool') => 'i',//числа str_contains($t, 'decimal') or str_contains($t, 'float') or str_contains($t, 'double') => 'd',//дроби str_contains($t, 'blob') => 'b',//blob default => 's', }; } ?> ---- Server IP: 45.112.84.4 Probable Submitter: 45.91.159.162 (proxied: 185.86.124.64) ---- Manual Page -- https://php.net/manual/en/mysqli-stmt.bind-param.php Edit -- https://main.php.net/note/edit/127012 Del: integrated -- https://main.php.net/note/delete/127012/integrated Del: useless -- https://main.php.net/note/delete/127012/useless Del: bad code -- https://main.php.net/note/delete/127012/bad+code Del: spam -- https://main.php.net/note/delete/127012/spam Del: non-english -- https://main.php.net/note/delete/127012/non-english Del: in docs -- https://main.php.net/note/delete/127012/in+docs Del: other reasons-- https://main.php.net/note/delete/127012 Reject -- https://main.php.net/note/reject/127012 Search -- https://main.php.net/manage/user-notes.php

« previous php.notes (#218317) next »