Php 使用mysqli创建用户定义函数是一种良好的实践和安全的方法吗?

Php 使用mysqli创建用户定义函数是一种良好的实践和安全的方法吗?,php,mysql,mysqli,Php,Mysql,Mysqli,我正在尝试将我的项目从mysql更改为mysqli。我的数据库连接为: $link = mysqli_connect($hostname, $username, $password, $database); if(mysqli_connect_errno()) { echo "Opps! Connection could not be established: ", mysqli_connect_error(); exit(); } 然后我有一个用户定义的函数: functio

我正在尝试将我的项目从mysql更改为mysqli。我的数据库连接为:

$link = mysqli_connect($hostname, $username, $password, $database);
if(mysqli_connect_errno()) {
    echo "Opps! Connection could not be established: ", mysqli_connect_error();
    exit();
}
然后我有一个用户定义的函数:

function get_name($id) {
    $query = mysqli_query($link, "select name from staff where id='$id'");
    $result = mysqli_fetch_assoc($query);
    return $data = $result['name'];
}
我知道我必须声明$link为全局(如下所示),这可以正常工作

function get_name($id) {
    global $link;
    $query = mysqli_query($link, "select name from staff where id='$id'");
    $result = mysqli_fetch_assoc($query);
    return $data = $result['name'];
}

我的问题是:这是一种好的做法吗?它安全吗?

我不一定认为编写这样一个特定用途的函数是好的还是坏的做法,只要它符合您的需要。如果您计划在整个代码中的多个位置执行此确切任务,则函数有助于使代码更易于阅读并避免重复

就安全性而言,在查询中使用输入之前,需要对输入进行清理。对于整数
$id
字段,您可以简单地将其转换为整数
$id=(int)$id。对于其他数据类型,您可能希望使用
$id=mysqli\u real\u escape\u字符串($link,$id)对其进行转义。那你就安全了


我还建议你调查一下,而不是mysqli。我相信现在它更常用了。

从字面上看,这个问题没有什么意义。用户定义的函数几乎总是很好的实践,不管您是将它们与mysqli还是任何其他API一起使用。然而,一般来说,功能与安全无关

说到所提供的代码,它是不安全的,因为缺少准备好的声明

因此,为了使代码正确,您必须先创建函数来处理带有参数的mysqli查询。然后在您自己的助手函数中使用这些函数,使它们看起来像这样:

function get_name($id) {
    return dbgetOne("select name from staff where id=?",[$id]);
}

正如您所见,它不仅可以确保查询的安全,还可以缩短代码。

不要使用全局变量。它们是错误的做法,在尝试调试时会导致问题。对于过程函数,您希望将$link作为参数传递:
get\u name($link,$id)
。然而,如果你想学习一种好的方法,你应该研究OOP(面向对象编程)和类。如何共享数据库句柄只与增加或避免代码复杂性有关。更有趣的是,对于一个可能与用户输入一起使用的函数,可以使用绑定参数。(而且,mysqli并没有因此而受到广泛的青睐。在投入太多时间之前,请仔细阅读PDO。)对PDO的建议感到满意。关于清理用户输入,我在任何函数调用之前都会这样做。