【问题标题】:How to pass SQL string via function parameter [duplicate]如何通过函数参数传递SQL字符串[重复]
【发布时间】:2020-03-25 18:17:17
【问题描述】:

我想创建一个以 SQL 字符串为参数的函数并返回一个数组 我写了这个函数:

function getgquery($I_sql){
    $mysqli = new mysqli("localhost","root","","ACLUB");
    $sql = $I_sql;
    $result = $mysqli->query($sql);
    $Data = array();
    if(mysqli_num_rows($result)>0){
        while($row = mysqli_fetch_assoc($result)){
            $Data [] = $row;
        }
    }
    return $Data;
}

然后调用函数:

       print_r(getgquery('SELECT * FROM `poeple`'));   

但我收到此错误:

警告:mysqli_num_rows() 期望参数 1 为 mysqli_result, 在第 9 行的 N:\xampp\htdocs\test\functions.php 中给出的布尔值

【问题讨论】:

  • 会不会是一个简单的拼写错误? poeple != people
  • 在函数中连接的坏习惯,如果你经常这样做,你最终可能会在一个脚本中调用 10 个函数并连接 10 次。连接过程是一个比较慢的过程
  • @RiggsFolly OMG 我很尴尬非常感谢
  • @RiggsFolly 你觉得我应该怎么做?
  • 我想说我从来没有做过如此愚蠢的事情......但这与事实相去甚远:)

标签: php sql function mysqli parameters


【解决方案1】:

这是个好主意!

您收到错误是因为您没有启用错误报告,并且您没有看到您在 SQL 中输入的错字导致的错误。

正确的函数应该是这样的:

// Enable mysqli error reporting and open connection
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'username', 'password', 'db_test');
$mysqli->set_charset('utf8mb4'); // always set the charset

function getgquery(mysqli $mysqli, string $I_sql, array $params = []): ?array {
    $stmt = $mysqli->prepare($I_sql);
    if ($params) {
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    }
    $stmt->execute();
    if ($result = $stmt->get_result()) {
        return $result->fetch_all(MYSQLI_BOTH);
    }
}

// with the typo fixed:
print_r(getgquery($mysqli, 'SELECT * FROM `people`')); 
  1. 您需要在函数外部连接一次并将连接作为参数传递。
  2. 您需要使用准备好的语句!
  3. 摆脱这个无用的循环和num_rows

如果你觉得每次都传递给这个函数的连接太多了,你可以创建一个mysqli的子类,例如这样的:

class DBClass extends mysqli {
    public function __construct(
        $host = null,
        $username = null,
        $passwd = null,
        $dbname = null,
        $port = null,
        $socket = null
    ) {
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        parent::__construct($host, $username, $passwd, $dbname, $port, $socket);
        $this->set_charset('utf8mb4');
    }

    public function safeQuery(string $sql, array $params = []): ?array {
        $stmt = $this->prepare($sql);
        if ($params) {
            $stmt->bind_param(str_repeat("s", count($params)), ...$params);
        }
        $stmt->execute();
        if ($result = $stmt->get_result()) {
            return $result->fetch_all(MYSQLI_BOTH);
        }
        return null;
    }
}

然后像这样使用它:

$mysqli = new DBClass('localhost', 'username', 'password', 'db_test');
$result = $mysqli->safeQuery('SELECT * FROM people WHERE id=?', [$myId]);

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 2014-01-21
    • 1970-01-01
    • 2016-10-26
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2015-03-30
    相关资源
    最近更新 更多