обновление нескольких полей строк одним запросом

#php #mysqli

#php #mysqli

Вопрос:

В настоящее время я работаю над CMS, и у меня работает галерея, и конечный пользователь может загружать свои фотографии, и они появляются прямо в Интернете. Теперь я хочу создать опцию / функцию, чтобы конечный пользователь мог выбрать, какая фотография будет размещена в Интернете, а какая нет. Я нашел скрипт под названием update_multiple.php и это работает нормально, но я использую MySQLi. Я внес некоторые изменения, чтобы он использовал MySQLi, но теперь скрипт не работает, и я не знаю почему. Я не получаю никаких ошибок. Мой текст не добавляется в мою базу данных.

Надеюсь, кто-нибудь может помочь мне, что я делаю неправильно.

Мой код;

 <?php
ob_start();
require('../../lib/dbconnection.php');

$query = "SELECT * FROM gallery";
$result=$conn->query($query) or die(mysqli_error($conn));

$count=$result->num_rows;   

?>

<form name="form1" method="post" action="">
<table class="OnlineImages">
....
    <?php
        /* fetch associative array */
            while ($rows = $result->fetch_array(MYSQLI_ASSOC)) {
                ?>
            <tr>
                <td><?php $id[]=$rows['id']; ?><?php echo $rows['id']; ?></td>
                <td align="center"><input name="filename[]" type="text" id="filename" value="<?php echo $rows['filename']; ?>"></td>
                <td><input type="text" name="title[]" id="title" value="<?php echo $rows['title'];?>"></td>
                <td><input type="text" name="caption[]" id="caption" value="<?php echo $rows['caption'];?>"></td>

                <td><input type="text" name="home[]" id="home" value="<?php echo $rows['home'];?>"></td>
                <td><input type="text" name="photobook[]" id="photobook" value="<?php echo $rows['photobook'];?>"></td><br>
            </tr>
                <?php
        }
        ?>
    <input type="submit" name="submit" value="Submit">
</form>
</table>
<?php

// Check if button name "Submit" is active, do this 
if(isset($_POST['submit'])){
$title = $_POST['title'];
$caption = $_POST['caption'];
$home = $_POST['home'];
$photobook = $_POST['photobook'];
for($i=0;$i<$count;$i  ){
$sql1 = " UPDATE gallery SET title='$title[$i]', caption='$caption[$i]', home='$home[$i],photobook='$photobook[$i]' WHERE id='$id[$i]' ";
$result1=$conn->query($sql1);
}
}
if(isset($result1)){
header("location:foto-admin.php");
}
?>
  

Комментарии:

1. Используйте var_dump($mysqli-> ошибка); после каждого запроса, иначе мы будем стрелять в темноте.

2. Я получаю сообщение об ошибке: пытаюсь получить свойство не-объекта

Ответ №1:

Ваши переменные должны быть идентифицированы как таковые в строке.

Вам нужно сделать:

 " UPDATE gallery SET title='{$title[$i]}', caption='{$caption[$i]}', home='{$home[$i]}',photobook='{$photobook[$i]}' WHERE id='$id[$i]' "
  

Также вам не хватало ‘ после дома.

Пожалуйста, имейте в виду, что это приводит к sql-инъекциям и вместо этого должно выполняться с помощью подготовленного оператора.


Редактировать:

Также передайте идентификатор. Изменить

 <td><?php $id[]=$rows['id']; ?><?php echo $rows['id']; ?></td>
  

Для

 <td><input type="hidden" name="id[]" value="<?php echo $rows['id'] ?>" />
    <?php $id[]=$rows['id']; ?><?php echo $rows['id']; ?></td>
  

И добавить

 $id = $_POST['id'];
  

перед

 $title = $_POST['title'];
  

Комментарии:

1. Я действительно хочу использовать подготовленные операторы, но это еще один шаг. сначала основы и как это работает

2. Я сделал это, но это не помогло. Когда я перехожу с mysql на mysqli со всем остальным тем же, я получаю ошибки в своем журнале; [Ср. 18 июня 06:46:40 2014] [ошибка] [клиент 127.0.0.1] Уведомление PHP: неопределенная переменная: идентификатор в /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php в строке 31, реферер: ontwikkel.classicnails-studio.nl/admin/foto-admin.php Это всего лишькогда я что-то отправляю.

3. Обновил мой ответ, чтобы учесть это.

Ответ №2:

Насколько мне известно, несколько месяцев назад я работал в этой области и написал код для обновления нескольких строк / столбцов, надеюсь, этот код поможет вам получить представление по-другому.

 $group_sql  = $db->prepare("UPDATE `groups` SET `group`=? WHERE `group_id`=?;");

foreach($_POST['groups'] as $id => $group)

{

    $group_sql->execute(array($group, $id));

}
  

И многократное обновление:

 $query = array();

foreach($_POST['groups'] as $id => $group)

{

    $query[] = "WHEN {$id} THEN {$db->quote($group)}";

}


$query = "

UPDATE `groups`

SET `group` = CASE `group_id`

    " . implode("rn", $query) . "

END

WHERE `group_id` IN (" . implode(',', array_keys($_POST['groups'])) . ");

";
  

Который в конечном итоге сгенерирует:

 UPDATE `groups`

SET `group` = CASE `group_id`

    WHEN 3054 THEN 'moteris savo vaikams'

    WHEN 3055 THEN 'bičių šeimoje'

END

WHERE `group_id` IN (3054,3055)


UPDATE `groups`

    SET `group` = CASE `group_id`

        WHEN 3054 THEN 'moteris savo vaikams'

        WHEN 3055 THEN 'bičių šeimoje'

    END,

    SET `description` = CASE `group_id`

        WHEN 3054 THEN 'foo'

        WHEN 3055 THEN 'bar'

    END

    WHERE `group_id` IN (3054,3055)