Подтвердить что ты не робот

Единая стоимость 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;
}
4b9b3361

Ответ 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;

Приветствия