我正在尝试使用PHP中的自定义函数来简化我手动执行的许多操作。我对定制功能很陌生,所以我不确定这些限制。现在我正在尝试使用自定义函数获取MySQLi的数据这是代码,然后我将解释这个问题:
function connect_db($db = 'db_username') {
iconv_set_encoding("internal_encoding", "UTF-8");
mb_language('uni');
mb_internal_encoding('UTF-8');
@ $mysqli = new mysqli('host',$db,'password',$db);
if(mysqli_connect_errno())
{
die('connection error');
}
}
这个似乎工作得很好。这是下一个我遇到麻烦的功能。
编辑:感谢Jeremy1026的回复
function do_query($db = 'default_db', $query) {
connect_db();
$result = $mysqli->query($query);
if(!$result){
trigger_error("data selection error");
}
while($row = $result->fetch_assoc()){
$result_array[] = $row;
}
return $result_array;
}
我的主机强制数据库名称和用户名相同,所以如果数据库名称是'bob',访问它的用户名也将是'bob',这就是为什么$db
在连接中显示两次的原因
我遇到的问题是这两个函数位于functions.php
并从另一个页面调用。我希望能够根据列名从其他页面中的查询中提取结果。但我还需要能够使用格式化来实现这一点,那么可能while()
循环必须在该页面上发生而不是在函数中?我希望它尽可能地通用,无论页面或数据如何,这样我就可以将这两个函数用于我为站点运行的三个数据库的所有连接和所有查询。
上帝,我希望自己能够清醒。
非常感谢任何建议。我已经用Google搜索了一下,但很难找到任何没有使用过时mysql_
前缀或任何实际以我可以使用的方式返回数据的内容。
更新:我在访问相关网页时遇到以下错误:
致命错误:在 /functions.php 中的非对象上调用成员函数query()
有问题的行是$result = $mysqli->query($query);
。我认为这是因为它认为$query
未定义,但不应该在页面中调用定义吗?这是该页面的代码:
$query = "SELECT * FROM `table`";
$myArray = do_query($db, $query);
echo $myArray['column_name'];
答案 0 :(得分:2)
在你的第二个功能中,你没有返回任何数据,所以它会丢失。你需要告诉它要返回什么,见下文:
function do_query($db = 'default_db', $query) {
connect_db();
$result = $mysqli->query($query);
if(!$result){
trigger_error("data selection error");
}
while($row = $result->fetch_assoc()){
$result_array[] = $row;
}
return $result_array;
}
然后,在使用该功能时,您将执行以下操作:
$myArray = do_query($db, 'select column from table');
然后会使用查询结果填充 $myArray
。
答案 1 :(得分:1)
这是一个半答案。以下单个函数代替两个函数。
function query_db($database, $new_query) {
$sqli = new mysqli('host', $database, 'password', $database);
$sqli->set_charset("utf8");
global $result;
if($result = $sqli->query($new_query)){
return $result;
}
}
通过添加global $result
我能够从查询中访问结果,从另一个页面运行
query_db("username","SELECT * FROM `column`");
while($row = $result->fetch_assoc()){
print_r($row);
}
它比我没有功能更精简,但它仍然不是主意。如果我在另一个函数中连接到数据库,则它不起作用。如果我尝试将while
循环放在组合函数中,它就不起作用。我想,总比没有好。