单值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作为多键和单值[重复]
单值二叉树:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。