Неустранимая ошибка: Uncaught TypeError: возвращаемое значение safeQuery () должно быть типа array или null, возвращено bool - PullRequest
0 голосов
/ 09 июля 2020

Я столкнулся с проблемой. Я получаю эту ошибку

Неустранимая ошибка: Uncaught TypeError: возвращаемое значение safeQuery () должно быть типа array или null, bool возвращено в E: \ Hosted \ action \ conn \ db c. php: 69 Трассировка стека: # 0 E: \ Hosted \ action \ conn \ db c. php (6): safeQuery ('INSERT INTO cu ...', Array) # 1 { main} добавлено в E: \ Hosted \ action \ conn \ db c. php в строке 69

Я не уверен, где моя ошибка. Код работал. Но внезапно это прекращается. Возможно, я ошибся. Мои вопросы верны. Я перепроверил это. Вот мой код:

<?php
// Test:
    $sql = "INSERT INTO `customers`(`name`, `email`, `phn_num`) VALUES (?, ?, ?)";
    $params = array("Assad Rajab", "email@gmail.com", "0123456789");
    $cus_id = safeQuery($sql, $params);
    

function safeQuery(string $sql, array $params = [], $db = NULL ): ?array {
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    $conn = mysqli_connect("localhost", "phpmyadminuser", "Technik-Phone-Admin");
    if (!$conn) {
        die("no connection to database");
    } else {
        if (!mysqli_set_charset($conn, "utf8")) {
            die("Error loading character set utf8: </br>". mysqli_error($conn));
        } else {
            if (isset($db)) {
                // Use the given DB 
                mysqli_select_db($conn, $db);
            } else {
                // Use the default DB
                mysqli_select_db($conn, "technik-phone_mng");
            }
        }
    }

    // Prepare statement:
    $stmt = mysqli_prepare($conn, $sql);
    // If the statement has parameters then bind them all now
    if ($params) {
        mysqli_stmt_bind_param($stmt, str_repeat("s", count($params)), ...$params);
    }
    // Execute it and get results if there are any
    mysqli_stmt_execute($stmt);

    if ($result = mysqli_stmt_get_result($stmt)) {
        $row = mysqli_fetch_array($result, MYSQLI_BOTH);
        
        // echo $result->num_rows;
        // print_r($data);
        // echo $data[0]['name'];
        return $row;
    }
    // If the query was INSERT or UPDATE then return TRUE
    echo "Done";
    return TRUE;
}

?>

Я хочу иметь возможность возвращать идентификатор нового вставленного столбца. Insert_id не работал. В любом случае, чтобы вернуть это без использования другого запроса?

Обновление

то, что я пытаюсь сделать, безопасно для меня, написание

$sql = "sql stmt";
$result = mysqli_query($conn, $sql);
if(!$result){
  // do something
} else{
  // do something else
}

пытаюсь поместить указанный выше блок в безопасную функцию и избегать использования mysqli_real_escape()

Конечная цель моя конечная цель - получить возвращенный массив, если мой sql stmt был выбран. если stmt был вставлен, я хочу получить идентификатор новой вставленной строки. эта информация должна быть возвращена.

Обновление

ошибка в том, что возвращаемый результат должен быть ПУСТО (NULL). не правда. последняя проблема заключается в том, что я пытаюсь получить идентификатор новой отправленной строки. но я не знаю, как это сделать без exe c другого запроса для этого. есть идеи?

1 Ответ

0 голосов
/ 09 июля 2020

Чтобы получить идентификатор, вы можете просто использовать $db1->insert_id; на правильном объекте mysqli.

Примечания:

  1. Не открывайте соединение внутри функции . Вам нужно открыть соединение только один раз . Затем всякий раз, когда вы вызываете эту функцию, вы передаете правильное соединение в качестве аргумента.

  2. Эта функция должна возвращать только значение или вообще ничего. Он никогда не должен возвращать истину или ложь.

  3. Я не рекомендую использовать более одной базы данных в одном скрипте, но при необходимости вы должны иметь отдельный объект mysqli для каждого из них.

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// db 1
$db1 = new mysqli('localhost', 'user', 'pass', 'db1');
$db1->set_charset('utf8mb4'); // always set the charset
// db 2
$db2 = new mysqli('localhost', 'user', 'pass', 'db2');
$db2->set_charset('utf8mb4'); // always set the charset

// Test:
$sql = "INSERT INTO `customers`(`name`, `email`, `phn_num`) VALUES (?, ?, ?)";
$params = array("Assad Rajab", "email@gmail.com", "0123456789");
$cus_id = fetchSingleRow($db1, $sql, $params);

// get the auto generated ID:
$id =  $db1->insert_id;
    
/**
 * Fetches a single row from the database
 *
 * @param \mysqli $conn This is the valid mysqli object with open connection to a DB
 * @param string $sql   Your SQL query with placeholders
 * @param array $params An array of parameters to be bound. [optional]
 * @return array|null   This function will return an array representing a single row from the result or nothing at all.
 */
function fetchSingleRow(\mysqli $conn, string $sql, array $params = []): ?array {
    // Prepare statement:
    $stmt = mysqli_prepare($conn, $sql);
    // If the statement has parameters then bind them all now
    if ($params) {
        mysqli_stmt_bind_param($stmt, str_repeat("s", count($params)), ...$params);
    }
    // Execute it and get results if there are any
    mysqli_stmt_execute($stmt);

    if ($result = mysqli_stmt_get_result($stmt)) {
        $row = mysqli_fetch_array($result, MYSQLI_BOTH);
        return $row;
    }

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