单值Mysqli [重复]

Posted

技术标签:

【中文标题】单值Mysqli [重复]【英文标题】:Single Value Mysqli [duplicate] 【发布时间】:2012-07-12 16:49:58 【问题描述】:

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

怎么样

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

【讨论】:

这是获取mysqli结果值的最短代码行。 这假定返回的标量具有已知的字段名称。这与 OP 的代码不一致,它传入 ANY 查询(预期返回单个值;“标量”查询)。它甚至可能不是对记录字段的查询——它可能返回一个计数,甚至是一个系统变量。 万一query失败,这将导致Fatal error(在布尔值上调用成员函数fetch_object())。【参考方案2】:

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);

【讨论】:

或者把assoc改成array就可以了$getID[0] 没有人,没有人,没有人关心这个长期寻求的“单线”唯一有意义的部分远远超出了可见屏幕...... 投反对票仅仅是因为fetch_object() 在这个答案之前存在很多年,它返回一个简单的对象,这意味着在你写这个 mysqli 的时候确实有一个更好的选择。此外,您的答案是用程序命令编写的,而 OP 的问题是通过基于对象的 mysqli 编写的。 这假定返回的标量具有已知的字段名称。这与 OP 的代码不一致,它传入 ANY 查询(预期返回单个值;“标量”查询)。它甚至可能不是对记录字段的查询——它可能返回一个计数,甚至是一个系统变量。【参考方案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] : "";

【讨论】:

MYSQLI_NUM 是常量吗? 是的。 ***.com/questions/1684993/… 来自 php.net,“此可选参数是一个常量,指示应从当前行数据生成哪种类型的数组。此参数的可能值是常量 MYSQLI_ASSOC、MYSQLI_NUM 或 MYSQLI_BOTH。” 这个答案以及 John 和 rybo111 最近的答案是唯一直接解决 OP 代码的答案。 OP 的问题显示了一种接受任何返回标量查询的方法——不需要知道要返回的字段的名称。【参考方案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'");

【讨论】:

次要问题:查询可能包含limit(小写)而不是LIMIT。所以如果你使用答案中涉及LIMIT的部分,可能要进行测试if (strpos($sql, 'LIMIT') === false && strpos($sql, 'limit') === false) @ToolmakerSteve 好点 - 使用 strtoupper() 修复。 我们只希望SQL中没有字符串文字恰好包含字符串“limit”。 @trincot 没错,这是事后的想法 - if 语句可以使用正则表达式查找 LIMIT N(其中 N 为 0-9)。【参考方案5】:

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

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

您可以直接分配更多变量,而不仅仅是一个,因此您可以完全避免使用数组。详见php函数list()。

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

首先,

这样的函数应该支持prepared statements

否则将是horribly insecure。

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

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

$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]);

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

【讨论】:

【参考方案8】:

试试这样的:

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

干杯

【讨论】:

这假定返回的标量具有已知的字段名称。这与 OP 的代码不一致,它传入 ANY 查询(预期返回单个值;“标量”查询)。它甚至可能不是对记录字段的查询——它可能返回一个计数,甚至是一个系统变量。

以上是关于单值Mysqli [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyspark中使用reduceByKey作为多键和单值[重复]

将嵌套对象中的单值数组转换为单值javascript

965. 单值二叉树

单值二叉树(2021-8-8)

单值二叉树

单值二叉树:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。