【问题标题】:Single Value Mysqli [duplicate]单值Mysqli [重复]
【发布时间】:2012-07-12 11:46:54
【问题描述】:

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

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    首先,

    这样的函数应该支持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]);
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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 是常量吗?
        • 是的。 stackoverflow.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】:

          怎么样

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

          【讨论】:

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

          试试这样的:

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

          干杯

          【讨论】:

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

          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 查询(预期返回单个值;“标量”查询)。它甚至可能不是对记录字段的查询——它可能返回一个计数,甚至是一个系统变量。
          猜你喜欢
          • 2017-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-29
          • 1970-01-01
          • 1970-01-01
          • 2015-06-17
          相关资源
          最近更新 更多