Единая стоимость 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;
}
Ответы
Ответ 1
Расширение 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);
Ответ 2
Как насчет
$name = $mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name;
Ответ 3
Всегда лучше всего создать соединение один раз в начале и закрыть в конце. Вот как я буду реализовывать вашу функцию.
$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] : "";
}
Ответ 4
Вот что я закончил с:
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'");
Ответ 5
Даже это старая тема, я не вижу здесь довольно простой способ, который я использовал для такого назначения:
list($value) = $mysqli->fetch_array;
вы можете назначить непосредственно больше переменных, а не только один, и вы можете избежать использования массивов полностью. Подробнее см. Функцию php list().
Ответ 6
Хотя в вашей реализации есть много недостатков (повторное подключение в одиночку!), а также в других ответах (однострочный калькулятор за счет перемещения параметров с экрана?), есть существенный вариант:
Такая функция должна поддерживать Подготовленные утверждения
В противном случае это будет ужасно небезопасно.
Таким образом, единственным приемлемым способом вызова такой функции будет
$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;
}
И один с использованием 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]);
поскольку это единственный правильный и безопасный способ вызова такой функции, в то время как во всех других вариантах отсутствует безопасность, читаемость, обработка ошибок и разумность.
Ответ 7
Это не полностью избегает массива, но распределяет его в одной строке.
function getval($query) {
$mysqli = new mysqli();
$mysqli->connect(HOST, USER, PASS, DB);
return $mysqli->query($query)->fetch_row()[0];
}
Ответ 8
Попробуйте что-то вроде этого:
$last = $mysqli->query("SELECT max(id) as last FROM table")->fetch_object()->last;
Приветствия