Uncaught Error: вызов функции-члена fetch () для строки - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь обновить строки базы данных с помощью вызовов API, но по какой-то причине возникает эта ошибка:

Uncaught Ошибка: вызов функции-члена fetch () для строки

Я не уверен, что это означает под функцией в строке, поскольку я применяю ее к объекту mysqli_stmt.

Вот так выглядит файл put:

    if (isset($authlvl)) {
    if (ctype_space($authlvl) == false && $authlvl >= 3) {
        if (isset($id) && ctype_space($id) == false) {
            if (isset($id) && ctype_space($id) == false && $id !== null) {
                $rule = $id;
                $request = 'id';
            } else if (isset($username) && ctype_space($username) == false && $username !== null) {
                $rule = $username;
                $request = 'username';
            } else if (isset($email) && ctype_space($email) == false && $email !== null) {
                $rule = $email;
                $request = 'email';
            } else if (isset($password) && ctype_space($password) == false && $password !== null) {
                $rule = $password;
                $request = 'password';
            } else if (isset($image) && ctype_space($image) == false && $image !== null) {
                $rule = $image;
                $request = 'image';
            } else {
                $request = "1";
                $rule = "2";
            }

            $post = new Post($db);
            $result = $post->post($request, $rule);
            $result->bind_result($previd, $prevusername, $prevemail, $prevpassword, $previmage, $prevauthlvl);
            $result->store_result();
            $num = $result->num_rows();

            if ($num > 0) {
                while ($result->fetch()) {
                    $put = new Put($db);
                    $result = $put->update(
                        isset($username) ? preg_replace('/\s+/', '', $username) : null,
                        isset($email) ? preg_replace('/\s+/', '', $email) : null,
                        isset($password) ? preg_replace('/\s+/', '', $password) : null,
                        isset($image) ? preg_replace('/\s+/', '', $image) : null,
                        isset($authlvl) ? preg_replace('/\s+/', '', $authlvl) : null,
                        $previd,
                        $prevusername,
                        $prevemail,
                        $prevpassword,
                        $previmage,
                        $prevauthlvl
                    );
                    echo $result;
                }
            } else {
                echo "Couldn't update row. Reason: 404 Not Found";
            }
        } else {
            echo "A valid id is required!";
        }
    } else {
        echo "You are not authorized to peform this request!";
    }
} else {
    echo "You are not authorized to peform this request!";
}

$ username, $ email ect ... вычисляются с помощью огромного беспорядка операторов if, который я не буду сейчас включать, потому что он использует много строк, но вот небольшая его часть:

   $content = file_get_contents('php://input');
     if (strpos($content, "email") !== false) {
                $email = substr($content, (strpos($content, "email")) + 10, ((strpos($content, "-", strpos($content, "email"))) - strpos($content, "email")) - 12);
  }

вот почтовый файл, который отправляет запрос:

class Post

{

private $conn;

public $id;
public $username;
public $email;
public $password;
public $image;
public $authlvl;

public function __construct($db)
{
    $this->conn = $db;
}

public function post($request, $rule)
{
    $format = "s";

    if ($request == "id") {
        $query = "SELECT * FROM users WHERE id=?";
        $format = "i";
    } else if ($request == "username") {
        $query = "SELECT * FROM users WHERE username=?";
    } else if ($request == "email") {
        $query = "SELECT * FROM users WHERE email=?";
    } else if ($request == "password") {
        $query = "SELECT * FROM users WHERE password=?";
    } else if ($request == "image") {
        $query = "SELECT * FROM users WHERE image=?";
    } else {
        $query = "SELECT * FROM users";
    }

    if ($stmt = $this->conn->prepare($query)) {
        $stmt->bind_param("" . $format . "", $rule);
        $stmt->execute();
        return $stmt;
    } else {
        echo "invalid string";
    }
  }
}

Я тестирую API с почтальоном.

Что я уже пробовал:

  1. Сохранение результата в файле записи.
  2. Переопределение $ stmt в $ stmt-> execute (), которое дает мнеложная логическая ошибка.
  3. Преобразование детали в PDO (позже выяснилось, что вы не можете смешивать OOP с PDO)
  4. Жестко закодированные переменные всторона положить файл, который также не удается

Если у кого-нибудь есть решение, дайте мне знать:)

1 Ответ

0 голосов
/ 16 октября 2019
while ($result->fetch()) {
    $put = new Put($db);
    // Here you reassign $result which now is a string.
    $result = $put->update(
        isset($username) ? preg_replace('/\s+/', '', $username) : null,
        isset($email) ? preg_replace('/\s+/', '', $email) : null,
        isset($password) ? preg_replace('/\s+/', '', $password) : null,
        isset($image) ? preg_replace('/\s+/', '', $image) : null,
        isset($authlvl) ? preg_replace('/\s+/', '', $authlvl) : null,
        $previd,
        $prevusername,
        $prevemail,
        $prevpassword,
        $previmage,
        $prevauthlvl
    );
    echo $result;
}

Вы переназначаете $result в своем цикле. Таким образом, он выполняется один раз, а затем выдает указанное выше сообщение об ошибке.

...