PHP изменение fetch_field () на mysqli - PullRequest
0 голосов
/ 07 января 2020

Мои php знания довольно ограничены, но мне недавно понадобилось обновить ряд веб-страниц с более старой версии php 5.2 до php 7.3.

Мне удалось обновить большинство mysql ссылок на mysqli et c и заставить все работать правильно, однако есть одна страница, которая использует календарь, и я действительно борюсь с этим section и часть fetch_field, в частности, как и любые примеры, которые я нашел, похоже, не в похожем формате.

Код, который мне нужно обновить, приведен ниже;

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;
    }
}

Ответы [ 2 ]

1 голос
/ 10 января 2020

Исходная функция неверна на многих уровнях. И нет смысла воссоздавать его функциональность.

В основном все, на что вы торгуетесь, это всего лишь несколько SQL ключевых слов. Но эти ключевые слова способствуют читаемости .

Почему-то вы решили перехитрить несколько поколений программистов, которые очень довольны синтаксисом SQL, и сделать нечитабельными гиббери sh

$row = selectonerow("some, foo, bar", "baz", "id", [$uniquevalue]);

вместо почти естественного Engli sh

$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. Любое условие.

0 голосов
/ 10 января 2020

Я бы порекомендовал избавиться от этой функции или заменить ее на функцию, предложенную 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 в сигнатуру функции, поэтому вы должны передавать ее при каждом вызове этой функции. Функция всегда будет возвращать массив; если никакие записи не извлечены, массив будет пустым. Это рекомендуемый способ. Также не забывайте всегда использовать подготовленные выражения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...