PHP将fetch_field()更改为mysqli

PHP将fetch_field()更改为mysqli,php,mysqli,Php,Mysqli,我的php知识相当有限,但我最近需要将一些网页从旧版本的PHP5.2更新到PHP7.3 我已经设法更新了对mysqli等的大多数mysql引用,并使其正常工作,但是有一个页面使用了日历,我真的很难处理这一部分,尤其是fetch_字段部分,因为我发现的任何示例似乎都没有类似的格式 我需要更新的代码如下 require_once('Connections/connAsh.php'); mysql_select_db($database_connAsh, $connAsh); function se

我的php知识相当有限,但我最近需要将一些网页从旧版本的PHP5.2更新到PHP7.3

我已经设法更新了对mysqli等的大多数mysql引用,并使其正常工作,但是有一个页面使用了日历,我真的很难处理这一部分,尤其是fetch_字段部分,因为我发现的任何示例似乎都没有类似的格式

我需要更新的代码如下

require_once('Connections/connAsh.php');
mysql_select_db($database_connAsh, $connAsh);

function selectonerow($fieldsarray, $table, $uniquefield, $uniquevalue)
{
    //The required fields can be passed as an array with the field names or as a comma separated value string
    if (is_array($fieldsarray)) {
        $fields = implode(", ", $fieldsarray);
    } else {
        $fields = $fieldsarray;
    }
    //performs the query
    $result = mysql_query("SELECT $fields FROM $table WHERE $uniquefield = '$uniquevalue'") or die("Could not perform select query - " . mysql_error());

    $num_rows = mysql_num_rows($result);

    //if query result is empty, returns NULL, otherwise, returns an array containing the selected fields and their values
    if ($num_rows == NULL) {
        return NULL;
    } else {
        $queryresult = array();
        $num_fields = mysql_num_fields($result);
        $i = 0;
        while ($i < $num_fields) {
            $currfield = mysql_fetch_field($result, $i);
            $queryresult[$currfield->name] = mysql_result($result, 0, $currfield->name);
            $i++;
        }
        return $queryresult;
    }
}
我试图编辑的是

require_once('../Connections/connAsh.php')
$connAsh->select_db($database_connAsh);
function selectonerow($fieldsarray, $table, $uniquefield, $uniquevalue)
{
    //The required fields can be passed as an array with the field names or as a comma separated value string
    if (is_array($fieldsarray)) {
        $fields = implode(", ", $fieldsarray);
    } else {
        $fields = $fieldsarray;
    }

    //performs the query
    $result = $connAsh->query("SELECT $fields FROM $table WHERE $uniquefield = '$uniquevalue'") or die("Could not perform select query - " . mysqli_error());
    $num_rows = mysqli_num_rows($result);
    //if query result is empty, returns NULL, otherwise, returns an array containing the selected fields and their values
    if ($num_rows == NULL) {
        return NULL;
    } else {
        $queryresult = array();
        $num_fields = mysqli_num_fields($result);
        $i = 0;
        while ($i < $num_fields) {
            $currfield = mysqli_fetch_field($result);
            $queryresult[$currfield->name] = mysqli_fetch_array($result, MYSQLI_BOTH);
            $i++;
        }
        return $queryresult;
    }
}

我建议去掉这个函数,或者用YCS建议的函数替换它

如果您真的想继续使用这个函数,请考虑下面的修复。您使内部的代码非常复杂,并且忘记将连接变量传递到函数中。我简化了它:

// open the DB connection properly inside Connections/connAsh.php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$connAsh = new mysqli('host', 'user', 'pass', $database_connAsh);
$connAsh->set_charset('utf8mb4');

// your function:
function selectonerow(mysqli $connAsh, $fieldsarray, $table, $uniquefield, $uniquevalue): array
{
    //The required fields can be passed as an array with the field names or as a comma separated value string
    if (is_array($fieldsarray)) {
        $fields = implode(", ", $fieldsarray);
    } else {
        $fields = $fieldsarray;
    }

    //performs the query
    $stmt = $connAsh->prepare("SELECT $fields FROM $table WHERE $uniquefield = ?");
    $stmt->bind_param('s', $uniquevalue);
    $stmt->execute();
    return $stmt->get_result()->fetch_assoc();
}

这是你的功能,但是去除了很多噪音。我在函数的签名中添加了$connAsh,因此每次调用此函数时都必须传入它。函数将始终返回一个数组;如果未提取任何记录,则数组将为空。这是推荐的方法。还要记住始终使用准备好的语句

原来的函数在很多级别上都是错误的。重新创建它的功能是没有意义的

基本上,您在这里讨价还价的只是几个SQL关键字。但这些关键词有助于提高可读性

出于某种原因,您决定智胜几代对SQL语法非常满意的程序员,并制造出难以理解的胡言乱语

$row = selectonerow("some, foo, bar", "baz", "id", [$uniquevalue]);
而不是几乎自然的英语

$row = selectonerow("SELECT some, foo, bar FROM baz WHERE id=?", [$uniquevalue]);
来吧。这不值得

使您的函数接受常规SQL查询,而不是有限的难以理解的混乱

function selectonerow(mysqli $conn, string $sql, array $params = []): array
{
    if ($params) {
        $stmt = $conn->prepare($sql);
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param(str_repeat("s", count($params), ...$params);
        $stmt->execute();
        $result = $stmt->get_result()
    } else {
        $result = $conn->query($sql);
    }
    return $result->fetch_assoc();
}
此函数允许您使用任何查询。例如,是否需要一行具有最大价格

$row = selectonerow("SELECT * FROM baz ORDER BY price DESC LIMIT 1");
需要更复杂的条件吗?没问题

$sql = "SELECT * FROM baz WHERE email=? AND activated > ?";
$row = selectonerow($sql, [$email, $date]);

等等。任何SQL。任何条件

看看这里的示例2:这与您的情况相同……最快的方法是在php.net上搜索函数,如mysql\u select\u db将向您显示新的替代函数,您可能希望使用prepare语句来防止sql注入。而不是逐字段查询循环。这是否回答了您的问题?看看如何在这里使用mysqli:非常感谢你花这么多时间来做这件事,我会尝试使用建议的mysqli_fetch_assoc函数,但如果我不能让它工作,我会尝试一下。我没有写原始代码,所以不知道为什么要这样写,但最近我自己在php知识非常有限的情况下尝试让网站正常工作,这是一个不幸的任务。非常感谢,现在我需要的页面上的所有代码都正常工作了。