Сообщение об ошибке: Array() Предупреждение: mysqli::query() ожидает, что параметр 1 будет строкой, объектом

У меня был запрос, который работал идеально гладко, обновляя базу данных новым названием изображения, которое дал пользователь. Что можно увидеть ниже:

<?php

    $query = "SELECT * FROM `tblImage`";
    $result = $conn -> query($query);
    while($row = $result -> fetch_assoc())
    {
?>
    <form method = "post" action = "">
    <a href = "<?php echo $row['fldFilePath']; ?>" data-lightbox = "gallery" data-title = "<?php echo $row['fldName']; ?>"><img src = "<?php echo $row['fldFilePath']; ?>" class = "ImgRound"></a>

    <label>Image Name: <?php echo $row['fldName']; ?></label>

    <input name  = "img-title" type  = "text" placeholder = "Enter New Image Title...">
    <button type = "submit" value  = "<?php echo $row['fldName'] ?>" name = "update_title" class = "ImgRound">Update Title</button>


    <button type = "submit" value  = "<?php echo $row['fldName'] ?>" name = "delete" class = "ImgRound">Delete</button>
    </form>
<?php

    if (isset($_POST['update_title']))
        {
        $imgTitle = $_POST['img-title'];

        $stmt= "UPDATE `tblImage` SET `fldName` = '$imgTitle' WHERE `fldName` = '$_POST[update_title]' ";   


        $result = $conn -> query($stmt);    
        if ($conn -> query($stmt))
            {
                header("Refresh:0");

            }   
        }

    }
?>

Однако, когда я вернулся к коду, чтобы связать параметры для $stmt, я где-то в коде допустил ошибку, сообщение об ошибке говорит мне: Array ( ) Warning: mysqli::query() expects parameter 1 to be string, object given.

Запрос на обновление, который я пробовал, выдал это сообщение:

$stmt = $conn->prepare("UPDATE `tblImage` SET `fldName` = ? WHERE `fldName` = ?");
$stmt->bind_param("ss", $imgTitle, $_POST['update-title']);
$stmt->execute();


if ($conn -> query($stmt))
    {
        header("Refresh:0");
    }   

Я посмотрел здесь под этим сообщением об ошибке, и я изо всех сил пытаюсь понять, что я сделал.

если вы вызываете $stmt->execute(), вы не вызываете $conn->query($stmt) ~ в этот момент $stmt является объектом

Professor Abronsius 22.03.2019 12:41

Привет @RamRaider Понятно!! Позвольте мне попробовать это сейчас, знаете ли вы, что я должен поместить в этот оператор if, чтобы обновить заголовок?

qwpozxmn 22.03.2019 12:42
$result = $conn -> query($stmt); if ($conn -> query($stmt)) который выполняет запрос дважды, кстати.
Qirel 22.03.2019 12:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы не должны пытаться передать свою переменную $stmt в query(). Чтобы проверить успешность UPDATE, просто проверьте результат execute():

$stmt = $conn->prepare("UPDATE `tblImage` SET `fldName` = ? WHERE `fldName` = ?") or die($conn->error);
$stmt->bind_param("ss", $imgTitle, $_POST['update_title']) or die($stmt->error);
if ($stmt->execute())
    {
        header("Refresh:0");
    }   
else {
    die($stmt->error);
}

Привет, @Nick, спасибо за объяснение, что сообщение об ошибке исчезло, однако заголовок изображения больше не обновляется. Это расстраивает, так как я хочу убедиться, что код защищен от SQL-инъекций, но кажется, что $stmt. в верхнем фрагменте кода, это единственное, что я могу заставить работать.

qwpozxmn 22.03.2019 12:45

@qwpozxmn странно, что запрос выглядит правильно. Вы должны проверить, что $stmt не является === false (на случай, если подготовка не удалась), а также что bind_param сработало. Смотрите мое редактирование

Nick 22.03.2019 12:52

@qwpozxmn у тебя тоже опечатка в bind_param, у тебя $_POST['update-title'] там, где должно быть $_POST['update_title']

Nick 22.03.2019 12:54

Ник и RamRaider огромное вам спасибо за помощь в этом. Так что у меня не должно было быть if ($conn -> query($stmt)) также как неловко за опечатку. ОБА ответа верны, я не уверен, какой из них поставить галочку СПАСИБО вам обоим!!!!

qwpozxmn 22.03.2019 14:55

Назначьте переменную методу prepare, чтобы вы могли проверить, успешно ли создан объект оператора, а затем назначьте переменную возвращаемому значению execute, чтобы проверить, что он также был успешным.

$stmt = $conn->prepare( "UPDATE `tblImage` SET `fldName` = ? WHERE `fldName` = ?" );
if ( $stmt ){
    $stmt->bind_param("ss", $imgTitle, $_POST['update_title']);
    $result = $stmt->execute();

    if ( $result )exit( header("Refresh:0") );
}

-- обновлено

<?php

    $query = "SELECT * FROM `tblImage`";
    $result = $conn->query($query);
    while( $row = $result -> fetch_assoc() ) {

?>

    <form method = "post">
        <a href = "<?php echo $row['fldFilePath']; ?>" data-lightbox = "gallery" data-title = "<?php echo $row['fldName']; ?>">
            <img src = "<?php echo $row['fldFilePath']; ?>" class = "ImgRound" alt='' />
        </a>
        <label>Image Name: <?php echo $row['fldName']; ?></label>
        <input name = "img-title" type = "text" placeholder = "Enter New Image Title..." />
        <button type = "submit" value = "<?php echo $row['fldName'] ?>" name = "update_title" class = "ImgRound">Update Title</button>
        <button type = "submit" value = "<?php echo $row['fldName'] ?>" name = "delete" class = "ImgRound">Delete</button>
    </form>


<?php

    } #close loop here ???

?>


<?php

    if ( isset( $_POST['update_title'], $_POST['img-title'] ) ) {

        $imgTitle = filter_input( INPUT_POST, 'img-title', FILTER_SANITIZE_STRING );
        $updateTitle = filter_input( INPUT_POST, 'update_title', FILTER_SANITIZE_STRING );

        if ( $imgTitle & $updateTitle ){

            $stmt = $conn->prepare( 'UPDATE `tblImage` SET `fldName` = ? WHERE `fldName` = ?' );

            if ( $stmt ){
                $stmt->bind_param( 'ss', $imgTitle, $updateTitle );
                $result = $stmt->execute();
                if ( $result )exit( header("Refresh:0") );
            }

            $stmt->close();
        }
    }
?>

Привет @RamRaider, спасибо за это, я также пробовал ваш код выше и снова, похоже, он больше не вносит никаких изменений в таблицу, то есть в заголовок изображения. Я уверен, что не должно иметь значения, связываю ли я свои параметры или нет, хммм!

qwpozxmn 22.03.2019 12:48

Я думаю, поправьте меня, если я ошибаюсь, проблема может заключаться в том, что ваш элемент формы называется update_title, а вы ищете $_POST['update-title'] в запросе на обновление...

Professor Abronsius 22.03.2019 12:54

@RamRaider, кажется, мы оба комментировали опечатку одновременно...

Nick 22.03.2019 12:56

Ник и RamRaider огромное вам спасибо за помощь в этом. Так что я не должен был иметь if ($conn -> query($stmt)) и как неловко из-за опечатки. ОБА ответа верны, я не уверен, какой из них поставить галочку СПАСИБО вам обоим!!!!

qwpozxmn 22.03.2019 14:56

@RamRaider, так как вы должны что-то получить за все эти усилия... +1

Nick 22.03.2019 21:49
$stmt->bind_param("ss", $imgTitle, $_POST['update-title']);

Вы даете 3 параметра здесь.

Разве не должно быть так..

$stmt = $conn->prepare("UPDATE `tblImage` SET `fldName` = ? WHERE `fldName` = ?");
$stmt->bind_param($_POST['update-title'], $imgTitle);

Предполагается, $_POST['update-title'] - обновленное значение. $imgTitle - значение для обновления

Привет @KushalArya У меня сложилось впечатление, что вы должны были указать тип информации, которую она ожидала, то есть «i» для междометия, «s» для строки, позвольте мне попробовать это в любом случае :)

qwpozxmn 22.03.2019 12:50

@qwpozxmn то, как вы используете bind_param, правильно, этот ответ неверен. php.net/manual/en/mysqli-stmt.bind-param.php

Nick 22.03.2019 12:53

Другие вопросы по теме