У меня был запрос, который работал идеально гладко, обновляя базу данных новым названием изображения, которое дал пользователь. Что можно увидеть ниже:
<?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");
}
Я посмотрел здесь под этим сообщением об ошибке, и я изо всех сил пытаюсь понять, что я сделал.
Привет @RamRaider Понятно!! Позвольте мне попробовать это сейчас, знаете ли вы, что я должен поместить в этот оператор if, чтобы обновить заголовок?
$result = $conn -> query($stmt); if ($conn -> query($stmt)) который выполняет запрос дважды, кстати.






Вы не должны пытаться передать свою переменную $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 странно, что запрос выглядит правильно. Вы должны проверить, что $stmt не является === false (на случай, если подготовка не удалась), а также что bind_param сработало. Смотрите мое редактирование
@qwpozxmn у тебя тоже опечатка в bind_param, у тебя $_POST['update-title'] там, где должно быть $_POST['update_title']
Ник и RamRaider огромное вам спасибо за помощь в этом. Так что у меня не должно было быть if ($conn -> query($stmt)) также как неловко за опечатку. ОБА ответа верны, я не уверен, какой из них поставить галочку СПАСИБО вам обоим!!!!
Назначьте переменную методу 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, спасибо за это, я также пробовал ваш код выше и снова, похоже, он больше не вносит никаких изменений в таблицу, то есть в заголовок изображения. Я уверен, что не должно иметь значения, связываю ли я свои параметры или нет, хммм!
Я думаю, поправьте меня, если я ошибаюсь, проблема может заключаться в том, что ваш элемент формы называется update_title, а вы ищете $_POST['update-title'] в запросе на обновление...
@RamRaider, кажется, мы оба комментировали опечатку одновременно...
Ник и RamRaider огромное вам спасибо за помощь в этом. Так что я не должен был иметь if ($conn -> query($stmt)) и как неловко из-за опечатки. ОБА ответа верны, я не уверен, какой из них поставить галочку СПАСИБО вам обоим!!!!
@RamRaider, так как вы должны что-то получить за все эти усилия... +1
$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 то, как вы используете bind_param, правильно, этот ответ неверен. php.net/manual/en/mysqli-stmt.bind-param.php
если вы вызываете
$stmt->execute(), вы не вызываете$conn->query($stmt)~ в этот момент $stmt является объектом