Добрый вечер! Такая проблема - на сайте есть не сложная админка, в неё выводятся в цикле статьи . Статью можно отредактировать. В статьях есть картинки , которые хранятся в папке. Проблема в следующем - если редактирую текст, то картинки не сохраняются, их надо загружать заново каждый раз когда редактирую текст. Можно ли сдлеать так, чтоб сохранялись старые картинки , если я не заменяю их новыми PHP: $id = $_GET['ID']; $sql = mysql_query("SELECT * FROM `vakans` WHERE `id_vakans`='$id'"); $row = mysql_fetch_array($sql); HTML: <form action="update2_vakans.php?ID=<?php echo $id; ?>" method="post" enctype="multipart/form-data"> ....... <tr> <td>Картинка:</td> <td><img src="file/<?echo $row['foto']?>" width="100" height="150" id="foto"></td> </tr> <tr> <td> <input type="file" name="foto" size="50" value="<?echo $row['foto']?>"> </td> </tr> .......... <input type="submit" name ="save" value="Отредактировать"> фаил редактирования PHP: $id = $_GET['ID']; $sql = mysql_query("SELECT * FROM `vakans` WHERE `id_vakans`='$id'"); $row = mysql_fetch_array($sql); if(isset($_POST['save'])) { $foto = strip_tags(trim($_FILES['foto']['name'])); mysql_query("UPDATE `vakans`SET foto='$foto', WHERE id_vakans = '$id' " ); mysql_close(); } if ($_FILES['foto']['error'] == 0) { $tempp = $_FILES['foto']['tmp_name']; $name_files = iconv("UTF-8", "WINDOWS-1251", $_FILES['foto']['name']); move_uploaded_file($tempp, "file/" . $name_files); }
У тебя фото обновляется при каждом редактировании. Т.к. фото может не быть, то, возможно, в базу просто уйдёт NULL, перезаписав старую картинку. Выход - проверить, была ли загружена картинка
как это сделать практически? if (!empty($row['foto'])){ ?????? } и не соображу, куда вписывать, в запрос? Ещё раз скажу: - если картинка есть в базе и я не меняю её во время редактирвоания, то она должна остаться после редактирования статьи. - так же должна быть возможность загрузить новую картинку вместо старой;
Что касается твоего запроса, то проверяй на empty поступающие данные в массиве files. И далее если они пусты не обновляй их. PHP: if(!empty($_FILES['foto']['name'])) { // обновляй базу } // двигай дальше код... Вот что это за кошмар. Иди перечитай https://php.ru/forum/threads/zaschita-avtorizacii.59752/#post-483035 если в следующем твоём посте не изменишь mysql на mysqli или pdo, больше не буду помогать. --- Добавлено --- @viktor72 что не понятно спрашивай, пробуй и экспериментируй!
К сожалению не понимаю...куда вставлять..как делать... --- Добавлено --- Присягаю на верность Mysqli и клянусь отречься от mysql и предать его анафиме и забверию!
Как так? Попробуй как видится тебе и покажи. А дальше будем понимать, что и зачем. Так, но перед этим дам тебе маленькое задание. Переделать данный текст/код с использованием mysqli, далее прокомментировать каждую строчку твоего кода, на твоё понимание, что ты там делаешь. И потом скинуть сюда.
Присягаю на верность Mysqli и клянусь отречься от mysql и предать его анафиме и HTML: [LIST=1] <form action="update2_vakans.php?ID=<?php echo $id; ?>" method="post" enctype="multipart/form-data"> ....... <tr> <td>Картинка:</td> <td><img src="file/<?echo $row['foto']?>" width="100" height="150" id="foto"></td> </tr> <tr> <td> <input type="file" name="foto" size="50" value="<?echo$row['foto']?>???? if(!empty($_FILES['foto']['name'])) {???? ???"> </td> </tr> .......... <input type="submit" name ="save" value="Отредактировать"> [/LIST]
Кстати один момент, комментирование собственного кода, это очень крутой плюс будет, если ты научишься всё грамотно комментировать. --- Добавлено --- @viktor72 это php код, по твоему ты мне скинул? Или это всё же html? Или ты на до мной прикалываешься? Во первых сейчас html в топку, не трогаем его, комментируй и выкладывай сюда php код.
PHP: <form action="update2_vakans.php?ID=<?php echo $id; ?>" method="post" enctype="multipart/form-data"> ........ <tr> <td>Картинка:</td> <td><img src="file/<?echo $row['foto']?>" width="100" height="150" id="foto"></td> </tr> <tr><td> <input type="file" name="foto" size="50" value="<?echo$row['foto']?>???? if(!empty($_FILES['foto']['name'])) {???? ???"> </td> </tr> ......... <input type="submit" name ="save" value="Отредактировать"> --- Добавлено --- данные картинки не попадают в html форму для редактирования... и соответственно во время редактирования из формы в базу отправлятеся null
@viktor72 где твой php код? обработчик который ! Меня интересует, твой обработчик где ты добавляешь в базу? Куда приходят у тебя данные с поста? Там и пиши условие. Ты же не отправляешь форму на html документ, ты её отправляешь на какой то обработчик соответственно там у тебя и буду приниматься пост запросы. Вот и пиши там! И вообще перед тем как что - то куда то добавлять, или записывать, или сохранять, привыкни делать проверки, на существование и наличие якобы сохраняемых или добавляемых данных, потому что если их нет или не существует, то зачем исполнять в пустую весь этот код?
данные картинки не попадают в html форму для редактирования... и соответственно во время PHP: $id = $_GET['ID']; $sql = mysql_query("SELECT * FROM `vakans` WHERE `id_vakans`='$id'"); $row = mysql_fetch_array($sql); if(isset($_POST['save'])) { $foto = strip_tags(trim($_FILES['foto']['name'])); mysql_query("UPDATE `vakans`SET foto='$foto', WHERE id_vakans = '$id' " ); if ($rezum) { header('Refresh: 1; URL=http://localhost/dosvid/landing/vakans/del_vakans.php'); echo "<p><h2>Запись отредактирована.</2></p> <p><h3>Через 1 секунду страница перегрузится на список вакансий</3></p>"; } mysql_close(); } if ($_FILES['foto']['error'] == 0) { $tempp = $_FILES['foto']['tmp_name']; $name_files = iconv("UTF-8", "WINDOWS-1251", $_FILES['foto']['name']); move_uploaded_file($tempp, "file/" . $name_files); } ?>
Нахрена ты везде налипил strip_tags ? Ты что думаешь что если у тебя там будет написано <?php echo 'АХАХАХАХ Я ЗЛОЙ ЧИТЕР И Я ТЕБЯ ПОЛОМАЛ'; > Или ладно хер с ним вставит кто нибудь видео с порнухой типа с ютуба откуда нибудь, и оно потом вылезет на сайте? Если ты специально не засунешь в функцию eval у тебя это в php как было строкой так и останется строкой! Убери нахрен. А от sql инъекций это не спасёт. Я уже писал пост ты вообще хоть, что нибудь от туда прочитал? Где mysqli :? Где защита от инъекций, которую я вчера объяснял ? Смотри на пальцах. Объясню на примере пдо, так как мой любимый стиль кодинга - это ООП. PHP: function db_config() { return array( 'host' => '192.168.0.44', 'dbname' => 'DB_NAME', 'user' => 'USER', 'password' => 'PASSWORD', 'charset' => 'utf-8' ); } function db_connect () { $params = db_config(); $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}"; $db = new \PDO($dsn, $params['user'], $params['password']); return $db; } function db_prepare_query($array_prepare, $id) { $db = db_connect(); $sqlUpdate = ''; $i = 0; foreach ($array_prepare As $key => $value) { // Где $key - это наше поле в бд // Где $value - это названия поля в посте(По другому пусть будет в твоём понимании это name из поля формы), того что вносим в бд if($i == 0) { $el = ''; } else { $el = ', '; } $sqlUpdate .= $el.$key.'=:'.$value; //$i - это переменная нужна для определения итерации, // С помощью которой мы сможем проставить запятые в строке. $sqlUpdate $i++; } $result = $db->prepare('"UPDATE vakans SET '.$sqlUpdate.'WHERE id_vakans =:id '); $result->bindParam(':id', $id); // И возвращаем наш результ, в котором находится подготовленный запрос, в том виде в котором нам нужен return $result; } // Теперь стряпаем нужный нам массив из наших пост данных. // Я там видел у тебя неймы и поля в бд одинаковые =)) А значит можно сделать так! $prepare_array = []; foreach ($_POST as $key => $value) { if(!empty($_POST[$key])) { $prepare_array[$key] = $key; } } $query = db_prepare_query($prepare_array, $_GET['ID']); // Теперь состряпаем массив для execute $execute_array = []; foreach($_POST As $key => $value) { if(!empty($_POST[$key])) { $execute_array[':'.$key] = $value; } } // И отправляем запрос в бд. Вот так вот всё не хитро и не сложно разгребай! $query->execute($execute_array); --- Добавлено --- Разберай код и колупай его, так как он может тебе ещё пригодится не только в этом случае, но его слегка нужно доработать, и кое что изменить. Ты также можешь по типу как я сделал update сделать where! И предовать туда массив с where. В общем у тебя ноль понимания.. Читай статьи, что я дал вчера.
@viktor72, Для input[type='file'] атрибут value не работает, не трудись его даже заполнять. Вообще не указывай. Проверяй на входе массив $_FILES. Если он пустой, то значит не надо менять картинку, если заполнен, то надо. Если надо дать возможность удалять картинку, для этого делают дополнительный чекбокс обычно @askanim, зачем ты человеку даёшь PDO, если он хочет на mysqli писать? Ну и твою функцию db_connect(), раз уж ты хочешь её использовать вместо глобальной переменной для соединения, стоит немного переписать: PHP: function db_connect () { static $db = null; if ($db === null) { $params = db_config(); $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}"; $db = new \PDO($dsn, $params['user'], $params['password']); } return $db; } Практически синглтон Суть - теперь, сколько раз не вызывай db_connect(), экземпляр PDO будет создан только один. --- Добавлено --- О, и кстати, @askanim, в апдейте надо экранировать все значения, а не только id
@mkramer потому что я даю готовый пример. Но на том на чём мне нравится больше, если он хочет я кинул статьи, может почитать и сделать там всё понятно. --- Добавлено --- Ты весь мой пример прочитал? Ты внизу execute не видишь с подстановкой туда массива ? --- Добавлено --- @mkramer так порвало пукан, что даже не досмотрел? Я ему скинул конкретно под задачу работоспособную вещь. И прокомментил всё. То что ты изменил не для всего подойдёт.
Вот, теперь более понятно. Я тоже подозревал что с HTML: <input type="file"> такие номера не проходят. Но как проверять на входе $_FILES и как использовать чекбокс для того чтоб поменять картинку не хватает знаний... Буду перечитывать всё что тут написали
@viktor72, совсем нету алгоритмического чутья. Вот комменты и псевдокод PHP: if ($_SERVER["REQEUST_METHOD"] === "POST") { // Мы получили post-запрос // Обновляем все поля, кроме картинки: $mysqli->query("update set .... "); // Проверяем, пришёл ли к нам с запросом файл: if($_FILES['foto']['error']==0) { $tempp = $_FILES['foto']['tmp_name']; $name_files = iconv("UTF-8", "WINDOWS-1251", $_FILES['foto']['name']); // Вот это зачем, я не въехал, но пусть будет move_uploaded_file($tempp, "file/" . $name_files); // Обновляем картинку $mysqli->query("update set vakans set foto=.... "); } elseif (!empty($_POST["delete_foto"])) { $mysqli->query("update set vakans set foto='' ..."); // если надо, удаляем и сам файл } } Это псевдокод, до реального дополните сами --- Добавлено --- Да, если что, атрибут value не работает, но вот name необходимо указать для input[type='file']
Смотрю в него..пытаюсь понять... знаний пока не хватате.... Сейчас у меня написано процедурно .. мне не понятно, как выводится в форму для редактирования... не понимая этого, мне вообще ничегоне понятно... сегодня ещё раз перечитаю всё что тут написано на этой странице... код буду разбирать с мануалом в руках.. в коде используется pdo ? какое зло несет strip_tags?
@viktor72 да, у меня это процедурный подход, с использованием PDO --- Добавлено --- @viktor72 А нахрена он тебе на входящих данных ? просто нагромоздить не нужного кода? --- Добавлено --- @viktor72 только только это без сохранения картинки. По сути если ты сможешь разобрать мой код, я думаю ты дойдёшь до того чтобы его довести до ума, под свою задачу. @mkramer ты ему дал код, без защиты от sql инъекций....
Хорошее понятие - "алгоритмическое чутьё", надо запомнить... Это код мне более понятен, ... то что в "инпут типе =филе " он не влазит это я уже понял... Я представляю так: - 1. в файл -форму редактирования выводится картинка, что понять что она есть и посмотретьккакая она. 2. Потом если она меня устравиает я ничего с ней не делаю, наживаю кнопку , всё редактируется а картинка остается не тронутой. 3. если картинку хочу поменять , подгружаю через "инпут типе =филе " новую картинку и она отправляется на обработку в код кторый выше. Я так понял, что надо просто сделать, чтоб если картинку не меняю, нельзя чтоб в базу отправлялось null в ячейку фото...
@viktor72 короче учись, почитай про алгоритмы. Пойми как строится код, вообще смысл того как работает сервер - клиент. Вообще почитай про веб, как он устроен, мне кажется ты не понимаешь как он вообще работает, нет смысла учить тебе ща синтаксис и ман. Не с того начал.
Я не дал ему код, я дал псевдокод и предупредил об этом. --- Добавлено --- Если не надо менять картинку, не надо её указывать в команде update. Никак вот эта простая истина до вас не доходит
Что я понимаю: для меня не постижимо --- Добавлено --- да, но в той же форме выводится текст, который если я не меняю он сохраняется а не исчезает после апдейта. а мне нужено сделать чтоб был выбор оставлять как есть или поменять... приступаю к работе над вашим кодом Спасибо