单值Mysqli

时间:2012-07-12 16:49:59

标签: php mysqli

我正在尝试编写一个函数,它将使用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;
}

8 个答案:

答案 0 :(得分:31)

怎么样

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

答案 1 :(得分:25)

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 :(得分:7)

始终最好在开头创建一次连接并在结束时关闭。这是我如何实现你的功能。

$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] : "";
}

答案 3 :(得分: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'");

答案 4 :(得分:2)

虽然您的实施中存在许多缺陷(仅重复连接!)以及其他答案(以屏幕上移动参数为代价的单线程?),但有一个必不可少的缺陷:

这样的功能应该支持Prepared Statements

否则将是horribly insecure

因此,调用这样一个函数的唯一可接受的方法是

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

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

允许$query仅包含占位符,而实际数据必须单独添加。任何其他变体,包括此处发布的所有其他答案,绝不应该使用

假设我们需要其他类型的函数(例如getRow()getAll()),将它们全部组合在一个类中是合乎逻辑的。对于mysqli,您可以使用我的safeMysql wrapper

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

正如您所看到的,它具有非常简洁的语法并且非常安全。

如果您不想使用第三方包装,那么我强烈建议您使用PDO作为支持API,因为基于mysqli的实施会导致疯狂的金额代码。只需比较这两个函数,一个使用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]);

因为它是调用此类函数的唯一正确和安全的方法,而所有其他变体缺乏安全性,可读性,错误处理和理智。

答案 5 :(得分:2)

即使这是一个古老的主题,我也不会在这里看到我过去使用的非常简单的方式:

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

您可以直接分配更多变量,而不仅仅是一个,因此您可以完全避免使用数组。有关详细信息,请参阅php函数list()

答案 6 :(得分:2)

这并不能完全避免阵列,而是将其省去一行。

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

答案 7 :(得分:0)

尝试这样的事情:

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

干杯