我试图将我的项目从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'];
}
我的问题是:这是一个好的做法,是否安全?
答案 0 :(得分:1)
我不一定认为编写具有这种特定目的的函数是好的或坏的做法,只是符合您的需求。如果您计划在整个代码中的多个位置执行此确切任务,则函数可以使您的代码更易于阅读并避免重复自己。
就安全性而言,您需要在查询中使用它们之前清理输入。对于整数$id
字段的情况,您可以简单地将其转换为整数$id = (int)$id;
。对于其他数据类型,您可能希望使用$id = mysqli_real_escape_string($link, $id);
来转义它。那你就安全了。
我还建议您调查PDO而不是mysqli。我相信这些日子更常用。
答案 1 :(得分:1)
从字面上看,这个问题没什么意义。用户定义的函数几乎总是很好的做法,无论你是将它们与mysqli或任何其他API一起使用。然而,功能一般与安全无关。
在谈到提供的代码时,由于缺乏准备好的声明,因此不安全。
因此,为了使您的代码正确,您必须创建函数来首先处理带参数的mysqli查询。然后在你自己的帮助函数中使用这些函数,使它们看起来像这样:
function get_name($id) {
return dbgetOne("select name from staff where id=?",[$id]);
}
正如您所看到的,它不仅可以确保您的查询安全,还可以缩短您的代码。