我正在尝试编写一个函数,它将使用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;
}
答案 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)
虽然您的实施中存在许多缺陷(仅重复连接!)以及其他答案(以屏幕上移动参数为代价的单线程?),但有一个必不可少的缺陷:
否则将是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;
干杯