Я пытаюсь написать функцию, которая будет проверять одно значение в 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;
ура