35

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

8 回答 8

41

怎么样

$name = $mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name; 
于 2014-06-03T10:08:12.973 回答
28

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);
于 2012-09-17T23:55:35.240 回答
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] : "";
}
于 2013-02-13T22:37:09.583 回答
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'");
于 2014-03-24T23:51:47.827 回答
3

即使这是一个古老的话题,我在这里也看不到我曾经用于此类分配的非常简单的方法:

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

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

于 2015-02-23T21:53:58.187 回答
2

首先也是最重要的,

这样的函数应该支持准备好的语句

否则会非常不安全

此外,这样的函数不应该单独连接,而是接受现有的连接变量作为参数。

鉴于以上所有情况,调用此类函数的唯一可接受的方式是

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

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

function getVal($mysqli, $sql, $values = array())
{
    $stm = $mysqli->prepare($sql);
    if ($values)
    {
        $types = str_repeat("s", count($values));
        $stm->bind_param($types, ...$values);
    }
    $stm->execute();
    $stm->bind_result($ret);
    $stm->fetch();
    return $ret;
}

像这样使用哪个

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

这是调用此类函数的唯一正确且安全的方法,而所有其他变体都缺乏安全性,而且通常缺乏可读性。

于 2014-03-25T05:55:57.957 回答
2

这并没有完全避免阵列,而是在一行中省去了它。

function getval($query) {
    $mysqli = new mysqli();
    $mysqli->connect(HOST, USER, PASS, DB);
    return $mysqli->query($query)->fetch_row()[0];
}
于 2017-05-21T00:20:30.687 回答
-1

尝试这样的事情:

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

干杯

于 2013-11-08T10:16:12.277 回答