Подскажите как поправить код для перезаписи значений в базе данных. код ниже. задача такая. при запуске скрипта доп. поля на движке DLE в базе данных перезаписываются, но если еще раз запустить скрипт, то в базе данных будет затираться (удаляться) первое доп.поле со значением. как прописать условие, чтобы перезаписывались только те доп.поля, которые прописаны только для выполнения в скрипте. для наглядности записал видео - https://wdfiles.ru/1szv2 Сам код. Код (Text): <?php $dbhost = "localhost"; // Хост1 $dbuser = "*****_basekomp"; // Пользователь баз данных $dbpassword = "*****"; // Пароль $dbname = "*****"; // Имя баз данных // Подключение к базе $db = new mysqli($dbhost, $dbuser, $dbpassword, $dbname); // Проверка подключения с баз данных if ($db->connect_errno) { echo '<p>Не удалось подключиться к базе данных!</p>'; echo $db->connect_error; exit; } $db->set_charset('utf8'); // Экранируем $id = $db->real_escape_string($_POST['id']); $new_companies = $db->real_escape_string($_POST['companies']); $new_price = $db->real_escape_string($_POST['price']); $new_total_phones = $db->real_escape_string($_POST['total_phones']); $new_unique_email = $db->real_escape_string($_POST['unique_email']); $new_mobile_numbers = $db->real_escape_string($_POST['mobile_numbers']); $new_site_compani = $db->real_escape_string($_POST['site_compani']); // Получаем значения xfields $query = "SELECT xfields FROM dle_post WHERE id='$id'"; $result = $db->query($query); if ($result) { $row = $result->fetch_assoc(); $xfields = $row['xfields']; // Разбиваем xfields на пары $pairs = explode('||', $xfields); $data = []; foreach ($pairs as $pair) { $parts = explode('|', $pair); if (count($parts) == 2) { $data[$parts[0]] = $parts[1]; } } // Меняем нужные значения $data['price'] = $new_price; $data['companies'] = $new_companies; $data['total-phones'] = $new_total_phones; $data['unique-email'] = $new_unique_email; $data['site-compani'] = $new_site_compani; $data['mobile-numbers'] = $new_mobile_numbers; // Формируем новое значение обратно в xfields $new_xfields = ''; foreach ($data as $key => $value) { $new_xfields .= "||$key|$value"; } $new_xfields = substr($new_xfields, 1); // Обновляем бд $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'"; $update_result = $db->query($update_query); if ($update_result) { echo "Данные успешно обновлены!"; } else { echo "Ошибка при обновлении данных: " . $db->error; } } else { echo "Ошибка при выполнении запроса: " . $db->error; } // Закрываем соединение с базой данных $db->close(); ?>
вопрос не очень понятен.... но навскидку у вас нет проверки - вообще отправлялось ли что-то то есть если отправить пустую форму - скрипт все равно выполнится и обнулит перечисленные там поля сформулируйте адекватно вопрос.. ни и конечно-же без видео
Да уж куда ясней еще. при запуске скрипта значения доп. полей перезаписываются в базе данных, как и должно быть, но при повторном запуске скрипта, затирается (удаляется) значение первого дополнительного поля. как исправить, чтобы другие доп.поля не затирались (удалялись), а перезаписывались только те которые прописаны в скрипте.
кто попрошайничает, форуму и существуют, что бы спросить совета, а вы только для видимости, чтобы лишний комментарий набрать. нет совета, то проходим мимо. зачем тратить свое и мое время.
Добрый день! Попробуйте сделать так: PHP: <? $postVar = [ 'id', 'companies', 'price', 'total_phones', 'unique_email', 'mobile_numbers', 'site_compani' ]; $postVarIsset = []; //Проверяем $_POST var foreach ($postVar as $val) if(isset($_POST[$val])) $postVarIsset[$val] = $_POST[$val]; else if($val == "id") break; // проверяем, ecли в $postVarIsset id и хотя бы одно значение на замену if(count($postVarIsset) > 1 ) { $dbhost = "localhost"; // Хост1 $dbuser = "*****_basekomp"; // Пользователь баз данных $dbpassword = "*****"; // Пароль $dbname = "*****"; // Имя баз данных // Подключение к базе $db = new mysqli($dbhost, $dbuser, $dbpassword, $dbname); // Проверка подключения с баз данных if ($db->connect_errno) { echo '<p>Не удалось подключиться к базе данных!</p>'; echo $db->connect_error; exit; } $db->set_charset('utf8'); // Получаем значения xfields $query = "SELECT xfields FROM dle_post WHERE id='$id'"; $result = $db->query($query); if($result) { $row = $result->fetch_assoc(); $xfields = $row['xfields']; // Разбиваем xfields на пары $pairs = explode('||', $xfields); $data = []; foreach ($pairs as $pair) $data[] = explode('|', $pair); // Экранируем и меняем только введённые значения foreach ($postVarIsset as $key => $val) $data[$key] = $db->real_escape_string($val); // Формируем новое значение обратно в xfields $tmp = []; foreach ($data as $key => $value) $tmp[] = "$key|$value"; $new_xfields = implode("||", $tmp); // Обновляем бд $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'"; $update_result = $db->query($update_query); if ($update_result) echo "Данные успешно обновлены!"; else echo "Ошибка при обновлении данных: " . $db->error; //Закрываем соединение с базой данных $db->close(); } } ?> Удачи и хороших выходных!
Спасибо, я нашел в коде ошибку. вместо строки - $new_xfields = substr($new_xfields, 1);, нужно было прописать два - $new_xfields = substr($new_xfields, 2);
В Ваше в коде остались две ошибки : 1. нет проверки переменных $_POST 2. если результат SELECT false, Вы делаете UPDATE Сейчас в Вашем коде PHP: $new_xfields = ''; foreach ($data as $key => $value) { $new_xfields .= "||$key|$value"; } $new_xfields = substr($new_xfields, 2); можно сделать так или иначе PHP: $tmp = []; foreach ($data as $key => $value) $tmp[] = "$key|$value"; $new_xfields = implode("||", $tmp); Мой код я исправил PHP: <? $postVar = [ 'companies', 'price', 'total_phones', 'unique_email', 'mobile_numbers', 'site_compani' ]; $postVarIsset = []; //Проверяем $_POST var foreach ($postVar as $key = > $val) if(isset($_POST[$val])) $postVarIsset[$val] = $_POST[$val]; // проверяем, ecли в $postVarIsset id и хотя бы одно значение на замену if(count($postVarIsset) > 0 AND isset($_POST["id"])) { $dbhost = "localhost"; // Хост1 $dbuser = "*****_basekomp"; // Пользователь баз данных $dbpassword = "*****"; // Пароль $dbname = "*****"; // Имя баз данных // Подключение к базе $db = new mysqli($dbhost, $dbuser, $dbpassword, $dbname); $id = $db->real_escape_string($_POST['id']); // Проверка подключения с баз данных if ($db->connect_errno) { echo '<p>Не удалось подключиться к базе данных!</p>'; echo $db->connect_error; exit; } $db->set_charset('utf8'); // Получаем значения xfields $query = "SELECT xfields FROM dle_post WHERE id='$id'"; $result = $db->query($query); if($result) { $row = $result->fetch_assoc(); $xfields = $row['xfields']; // Разбиваем xfields на пары $pairs = explode('||', $xfields); $data = []; foreach ($pairs as $pair) $data[] = explode('|', $pair); // Экранируем и меняем только введённые значения foreach ($postVarIsset as $key => $val) $data[$key] = $db->real_escape_string($val); // Формируем новое значение обратно в xfields $tmp = []; foreach ($data as $key => $value) $tmp[] = "$key|$value"; $new_xfields = implode("||", $tmp); // Обновляем бд $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'"; $update_result = $db->query($update_query); if ($update_result) echo "Данные успешно обновлены!"; else echo "Ошибка при обновлении данных: " . $db->error; //Закрываем соединение с базой данных $db->close(); } } ?>
Любой код нужно отлаживать. Для начало попробуйте проверить если запись с id в БД и добавить в код PHP: print_r($_POST); ... ... print_r($postVarIsset); if(count($postVarIsset) > 0 AND isset($_POST["id"])) { ... ... // Получаем значения xfields $query = "SELECT xfields FROM dle_post WHERE id='$id'"; $result = $db->query($query); var_dump($result ); ... ... echo "$new_xfields, $id"; // Обновляем бд $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'";
>В Ваше в коде остались две ошибки : >1. нет проверки переменных $_POST >2. если результат SELECT false, Вы делаете UPDATE в данном случаи код присланный мой ранее рабочий, только вы писали про 2 ошибки, в чем может быть проблема или угроза при перезаписи? Критично ли это?
Обе ошибки критичны. Если нет проверки переменных $_POST, то, если есть id, а других нет то в БД могут затираться значения. С этого Вы начали описание Вашей проблемы. Если id нет, то будут возникать SQL ошибка на SELECT и UPDATE В коде необходимо проверять всё и всегда. p.s. То что не критично, но весьма полезно - использовать в коде циклы, например, PHP: $postVar = [ 'id', 'companies', 'price', 'total_phones', 'unique_email', 'mobile_numbers', 'site_compani' ]; //это $new_companies = $db->real_escape_string($_POST['companies']); $new_price = $db->real_escape_string($_POST['price']); $new_total_phones = $db->real_escape_string($_POST['total_phones']); $new_unique_email = $db->real_escape_string($_POST['unique_email']); $new_mobile_numbers = $db->real_escape_string($_POST['mobile_numbers']); $new_site_compani = $db->real_escape_string($_POST['site_compani']); //можно записать так foreach($postVar as $val) $$val = $db->real_escape_string($_POST[$val]);
в DLE должен быть инструмент для редактирования полей в таблице post. Очень сильно похож на Wordpress
Бывают интересные вопросы, бывает нет, Ваш отнёс к последним, приношу извинение за излишнюю грубость.