Intereting Posts
Переименование дубликатов файлов в папке с php Как сделать SELECT в PHP / MySQL нечувствительным? Нужен эффективный во времени метод импорта большого файла CSV через PHP в несколько таблиц MySQL Соединение MySql PDO с базой данных Лучше ли обращаться с дружественными / чистыми / красивыми URL-адресами с помощью mod_rewrite или с языком, подобным PHP? Импорт и сохранение данных из csv-файла в yii Переиндексация числовых ключей массива Повторить календарь событий по будням, например, Google Calendar в php Как частично загрузить удаленный файл с помощью cURL? onclick -> mysql query -> javascript; та же страница Что это значит, когда var_dump сообщает о неправильной длине строки? Получать значения из каждого json-объекта определенного ключа Безопасное выполнение заданий Cron с помощью Zend Framework Преобразование кода PHP в C ++ Что такое PHP как «Персональная домашняя страница» и «Препроцессор гипертекста PHP»?

Единая стоимость Mysqli

Я пытаюсь написать функцию, которая будет проверять одно значение в db, используя mysqli, не помещая его в массив. Что еще я могу сделать, кроме того, что я уже здесь делаю?

function getval($query){ $mysqli = new mysqli(); $mysqli->connect(HOST, USER, PASS, DB); $result = $mysqli->query($query); $value = $mysqli->fetch_array; $mysqli->close(); return $value; } 

Расширение mysql могло бы сделать это с помощью mysql_result, но mysqli не имеет эквивалентной функции на сегодняшний день, afaik. Он всегда возвращает массив.

Если бы я не просто создал запись, я делаю так:

 $getID = mysqli_fetch_assoc(mysqli_query($link, "SELECT userID FROM users WHERE something = 'unique'")); $userID = $getID['userID']; 

Или, если я просто создал запись, а столбец userID – AI, я делаю:

 $userID = mysqli_insert_id($link); 

Как насчет

 $name = $mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name; 

Всегда лучше всего создать соединение один раз в начале и закрыть в конце. Вот как я мог бы реализовать вашу функцию.

 $mysqli = new mysqli(); $mysqli->connect(HOSTNAME, USERNAME, PASSWORD, DATABASE); $value_1 = get_value($mysqli,"SELECT ID FROM Table1 LIMIT 1"); $value_2 = get_value($mysqli,"SELECT ID FROM Table2 LIMIT 1"); $mysqli->close(); function get_value($mysqli, $sql) { $result = $mysqli->query($sql); $value = $result->fetch_array(MYSQLI_NUM); return is_array($value) ? $value[0] : ""; } 

Вот что я закончил:

 function get_col($sql){ global $db; if(strpos(strtoupper($sql), 'LIMIT') === false) { $sql .= " LIMIT 1"; } $query = mysqli_query($db, $sql); $row = mysqli_fetch_array($query); return $row[0]; } 

Таким образом, если вы забудете включить LIMIT 1 в свой запрос (мы все это сделали), функция добавит его.

Пример использования:

 $first_name = get_col("SELECT `first_name` FROM `people` WHERE `id`='123'"); 

Даже это старая тема, я не вижу здесь довольно простой способ, который я использовал для такого назначения:

 list($value) = $mysqli->fetch_array; 

вы можете назначить непосредственно больше переменных, а не только один, и вы можете полностью избежать использования массивов. Подробнее см. В списке функций php () .

Хотя в вашей реализации есть много недостатков (повторное подключение в одиночку!), А также в других ответах (однострочный калькулятор за счет перемещения параметров с экрана?), Есть существенный:

Такая функция должна поддерживать Подготовленные заявления

В противном случае это будет ужасно неуверенно .

Таким образом, единственным приемлемым способом вызова такой функции будет

 $name = getVal($query, $param1, $param2); 

или

 $name = getVal($query, [$param1, $param2]); 

позволяя $query содержать только заполнители, в то время как фактические данные должны добавляться отдельно. Любой другой вариант, включая все другие ответы, размещенные здесь, никогда не должен использоваться .

Предполагая, что нам нужны другие функции такого типа (например getRow() , getAll() ), было бы логично объединить их все в одном классе. Для mysqli вы можете использовать мою оболочку safeMysql :

 $name = $db->getOne("SELECT name FROM users WHERE id = ?i", $id); 

как вы можете видеть, он имеет чрезвычайно сжатый синтаксис и совершенно безопасен.

Если вы не хотите использовать сторонние обертки, я настоятельно рекомендую вам использовать PDO в качестве API поддержки, просто потому, что реализация на основе mysqli приведет к безумному количеству кода . Просто сравните эти 2 функции, используя mysqli:

 function getVal($sql, $values = array()) { global $mysqli; $stm = $mysqli->prepare($sql); if ($values) { $types = str_repeat("s", count($values)); if (strnatcmp(phpversion(),'5.3') >= 0) { $bind = array(); foreach($values as $key => $val) { $bind[$key] = &$values[$key]; } } else { $bind = $values; } array_unshift($bind, $types); call_user_func_array(array($stm, 'bind_param'), $bind); } $stm->execute(); $stm->bind_result($ret); $stm->fetch(); return $ret; } - function getVal($sql, $values = array()) { global $mysqli; $stm = $mysqli->prepare($sql); if ($values) { $types = str_repeat("s", count($values)); if (strnatcmp(phpversion(),'5.3') >= 0) { $bind = array(); foreach($values as $key => $val) { $bind[$key] = &$values[$key]; } } else { $bind = $values; } array_unshift($bind, $types); call_user_func_array(array($stm, 'bind_param'), $bind); } $stm->execute(); $stm->bind_result($ret); $stm->fetch(); return $ret; } - function getVal($sql, $values = array()) { global $mysqli; $stm = $mysqli->prepare($sql); if ($values) { $types = str_repeat("s", count($values)); if (strnatcmp(phpversion(),'5.3') >= 0) { $bind = array(); foreach($values as $key => $val) { $bind[$key] = &$values[$key]; } } else { $bind = $values; } array_unshift($bind, $types); call_user_func_array(array($stm, 'bind_param'), $bind); } $stm->execute(); $stm->bind_result($ret); $stm->fetch(); return $ret; } - function getVal($sql, $values = array()) { global $mysqli; $stm = $mysqli->prepare($sql); if ($values) { $types = str_repeat("s", count($values)); if (strnatcmp(phpversion(),'5.3') >= 0) { $bind = array(); foreach($values as $key => $val) { $bind[$key] = &$values[$key]; } } else { $bind = $values; } array_unshift($bind, $types); call_user_func_array(array($stm, 'bind_param'), $bind); } $stm->execute(); $stm->bind_result($ret); $stm->fetch(); return $ret; } 

И один с использованием PDO:

 function getVal($query, $params = array()) { global $pdo; $stmt = $pdo->prepare($query); $stmt->execute($params); return $stmt->fetchColumn(); } 

и вы можете четко видеть разницу.

В любом случае, вы будете использовать эту функцию, как это

 $name = getVal("SELECT name FROM users WHERE id = ?", [$id]); 

поскольку это единственный правильный и безопасный способ вызова такой функции, в то время как все другие варианты не имеют безопасности, удобочитаемости, обработки ошибок и здравомыслия.

Это не полностью избегает массива, но распределяет его в одной строке.

 function getval($query) { $mysqli = new mysqli(); $mysqli->connect(HOST, USER, PASS, DB); return $mysqli->query($query)->fetch_row()[0]; } 

Попробуйте что-то вроде этого:

 $last = $mysqli->query("SELECT max(id) as last FROM table")->fetch_object()->last; 

ура