За последние 24 часа нас посетили 21159 программистов и 1079 роботов. Сейчас ищет 751 программист ...

Как поправить код

Тема в разделе "PHP и базы данных", создана пользователем sotex2, 22 мар 2024.

  1. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    Подскажите как поправить код для перезаписи значений в базе данных. код ниже. задача такая. при запуске скрипта доп. поля на движке DLE в базе данных перезаписываются, но если еще раз запустить скрипт, то в базе данных будет затираться (удаляться) первое доп.поле со значением. как прописать условие, чтобы перезаписывались только те доп.поля, которые прописаны только для выполнения в скрипте. для наглядности записал видео - https://wdfiles.ru/1szv2

    Сам код.

    Код (Text):
    1. <?php
    2.  
    3. $dbhost = "localhost"; // Хост1
    4. $dbuser = "*****_basekomp"; // Пользователь баз данных
    5. $dbpassword = "*****"; // Пароль
    6. $dbname = "*****"; // Имя баз данных
    7.  
    8.  
    9. // Подключение к базе
    10. $db = new mysqli($dbhost, $dbuser, $dbpassword, $dbname);
    11.  
    12. // Проверка подключения с баз данных
    13. if ($db->connect_errno) {
    14.   echo '<p>Не удалось подключиться к базе данных!</p>';
    15.   echo $db->connect_error;
    16.   exit;
    17. }
    18.  
    19. $db->set_charset('utf8');
    20.  
    21. // Экранируем
    22. $id = $db->real_escape_string($_POST['id']);
    23. $new_companies = $db->real_escape_string($_POST['companies']);
    24. $new_price = $db->real_escape_string($_POST['price']);
    25. $new_total_phones = $db->real_escape_string($_POST['total_phones']);
    26. $new_unique_email = $db->real_escape_string($_POST['unique_email']);
    27. $new_mobile_numbers = $db->real_escape_string($_POST['mobile_numbers']);
    28. $new_site_compani = $db->real_escape_string($_POST['site_compani']);
    29.  
    30.  
    31. // Получаем значения xfields
    32. $query = "SELECT xfields FROM dle_post WHERE id='$id'";
    33. $result = $db->query($query);
    34.  
    35. if ($result) {
    36.   $row = $result->fetch_assoc();
    37.   $xfields = $row['xfields'];
    38.  
    39.   // Разбиваем xfields на пары
    40.   $pairs = explode('||', $xfields);
    41.   $data = [];
    42.   foreach ($pairs as $pair) {
    43.     $parts = explode('|', $pair);
    44.     if (count($parts) == 2) {
    45.       $data[$parts[0]] = $parts[1];
    46.     }
    47.   }
    48.  
    49.   // Меняем нужные значения
    50.   $data['price'] = $new_price;
    51.   $data['companies'] = $new_companies;
    52.   $data['total-phones'] = $new_total_phones;
    53.   $data['unique-email'] = $new_unique_email;
    54.   $data['site-compani'] = $new_site_compani;
    55.   $data['mobile-numbers'] = $new_mobile_numbers;
    56.  
    57.   // Формируем новое значение обратно в xfields
    58.   $new_xfields = '';
    59. foreach ($data as $key => $value) {
    60.     $new_xfields .= "||$key|$value";
    61.   }
    62. $new_xfields = substr($new_xfields, 1);
    63.  
    64.   // Обновляем бд
    65.   $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'";
    66.  
    67.    $update_result = $db->query($update_query);
    68.  
    69.   if ($update_result) {
    70.     echo "Данные успешно обновлены!";
    71.   } else {
    72.     echo "Ошибка при обновлении данных: " . $db->error;
    73.   }
    74. } else {
    75.   echo "Ошибка при выполнении запроса: " . $db->error;
    76. }
    77.  
    78. // Закрываем соединение с базой данных
    79. $db->close();
    80. ?>
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.827
    Симпатии:
    738
    Адрес:
    Татарстан
    вопрос не очень понятен.... но навскидку у вас нет проверки - вообще отправлялось ли что-то
    то есть если отправить пустую форму - скрипт все равно выполнится и обнулит перечисленные там поля

    сформулируйте адекватно вопрос.. ни и конечно-же без видео
     
  3. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    Да уж куда ясней еще. при запуске скрипта значения доп. полей перезаписываются в базе данных, как и должно быть, но при повторном запуске скрипта, затирается (удаляется) значение первого дополнительного поля. как исправить, чтобы другие доп.поля не затирались (удалялись), а перезаписывались только те которые прописаны в скрипте.
     

    Вложения:

  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    864
    Симпатии:
    134
    @sotex2, некоммерческое овно или что, почему попрошайничае? Купите того, кто шарит.
     
  5. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    кто попрошайничает, форуму и существуют, что бы спросить совета, а вы только для видимости, чтобы лишний комментарий набрать. нет совета, то проходим мимо. зачем тратить свое и мое время.
     
  6. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    257
    Симпатии:
    50
    Адрес:
    Бавария, Германия
    Добрый день!
    Попробуйте сделать так:
    PHP:
    1. <?
    2. $postVar =
    3. [
    4.     'id',
    5.     'companies',
    6.     'price',
    7.     'total_phones',
    8.     'unique_email',
    9.     'mobile_numbers',
    10.     'site_compani'
    11. ];
    12.  
    13. $postVarIsset = [];
    14.  
    15. //Проверяем $_POST var
    16. foreach ($postVar as $val)
    17.     if(isset($_POST[$val]))
    18.         $postVarIsset[$val] = $_POST[$val];
    19.     else if($val == "id")
    20.         break;
    21.  
    22. // проверяем, ecли в $postVarIsset id и хотя бы одно значение на замену
    23. if(count($postVarIsset) > 1 )
    24. {
    25.     $dbhost = "localhost"; // Хост1
    26.     $dbuser = "*****_basekomp"; // Пользователь баз данных
    27.     $dbpassword = "*****"; // Пароль
    28.     $dbname = "*****"; // Имя баз данных
    29.  
    30.  
    31.     // Подключение к базе
    32.     $db = new mysqli($dbhost, $dbuser, $dbpassword, $dbname);
    33.  
    34.     // Проверка подключения с баз данных
    35.     if ($db->connect_errno) {
    36.       echo '<p>Не удалось подключиться к базе данных!</p>';
    37.       echo $db->connect_error;
    38.       exit;
    39.     }
    40.  
    41.     $db->set_charset('utf8');
    42.     // Получаем значения xfields
    43.     $query = "SELECT xfields FROM dle_post WHERE id='$id'";
    44.     $result = $db->query($query);
    45.     if($result)
    46.     {
    47.         $row = $result->fetch_assoc();
    48.         $xfields = $row['xfields'];
    49.  
    50.         // Разбиваем xfields на пары
    51.         $pairs = explode('||', $xfields);
    52.         $data = [];
    53.         foreach ($pairs as $pair)
    54.         $data[] = explode('|', $pair);
    55.  
    56.         // Экранируем и меняем только введённые значения
    57.         foreach ($postVarIsset as $key => $val)
    58.             $data[$key] = $db->real_escape_string($val);
    59.  
    60.         // Формируем новое значение обратно в xfields
    61.         $tmp = [];
    62.         foreach ($data as $key => $value)
    63.             $tmp[] = "$key|$value";
    64.         $new_xfields = implode("||", $tmp);
    65.  
    66.         // Обновляем бд
    67.         $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'";
    68.  
    69.         $update_result = $db->query($update_query);
    70.  
    71.         if ($update_result)
    72.                echo "Данные успешно обновлены!";
    73.         else
    74.             echo "Ошибка при обновлении данных: " . $db->error;
    75.         //Закрываем соединение с базой данных
    76.         $db->close();
    77.     }
    78. }
    79. ?>
    Удачи и хороших выходных!
     
    #6 Vladimir Kheifets, 22 мар 2024
    Последнее редактирование: 22 мар 2024
  7. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    Спасибо, я нашел в коде ошибку. вместо строки - $new_xfields = substr($new_xfields, 1);, нужно было прописать два -
    $new_xfields = substr($new_xfields, 2);
     
  8. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    257
    Симпатии:
    50
    Адрес:
    Бавария, Германия
    В Ваше в коде остались две ошибки :
    1. нет проверки переменных $_POST
    2. если результат SELECT false, Вы делаете UPDATE

    Сейчас в Вашем коде
    PHP:
    1. $new_xfields = '';
    2. foreach ($data as $key => $value) {
    3.     $new_xfields .= "||$key|$value";
    4.   }
    5. $new_xfields = substr($new_xfields, 2);
    можно сделать так или иначе
    PHP:
    1. $tmp = [];
    2. foreach ($data as $key => $value)
    3.       $tmp[] = "$key|$value";
    4. $new_xfields = implode("||", $tmp);
    Мой код я исправил
    PHP:
    1. <?
    2. $postVar =
    3. [
    4.     'companies',
    5.     'price',
    6.     'total_phones',
    7.     'unique_email',
    8.     'mobile_numbers',
    9.     'site_compani'
    10. ];
    11. $postVarIsset = [];
    12. //Проверяем $_POST var
    13. foreach ($postVar as $key = > $val)
    14.     if(isset($_POST[$val]))
    15.         $postVarIsset[$val] = $_POST[$val];
    16. // проверяем, ecли в $postVarIsset id и хотя бы одно значение на замену
    17. if(count($postVarIsset) > 0 AND isset($_POST["id"]))
    18. {
    19.     $dbhost = "localhost"; // Хост1
    20.     $dbuser = "*****_basekomp"; // Пользователь баз данных
    21.     $dbpassword = "*****"; // Пароль
    22.     $dbname = "*****"; // Имя баз данных
    23.  
    24.     // Подключение к базе
    25.     $db = new mysqli($dbhost, $dbuser, $dbpassword, $dbname);
    26.     $id = $db->real_escape_string($_POST['id']);
    27.  
    28.     // Проверка подключения с баз данных
    29.     if ($db->connect_errno) {
    30.       echo '<p>Не удалось подключиться к базе данных!</p>';
    31.       echo $db->connect_error;
    32.       exit;
    33.     }
    34.     $db->set_charset('utf8');
    35.  
    36.     // Получаем значения xfields
    37.     $query = "SELECT xfields FROM dle_post WHERE id='$id'";
    38.     $result = $db->query($query);
    39.     if($result)
    40.     {
    41.         $row = $result->fetch_assoc();
    42.         $xfields = $row['xfields'];
    43.         // Разбиваем xfields на пары
    44.         $pairs = explode('||', $xfields);
    45.         $data = [];
    46.         foreach ($pairs as $pair)
    47.         $data[] = explode('|', $pair);
    48.         // Экранируем и меняем только введённые значения
    49.         foreach ($postVarIsset as $key => $val)
    50.             $data[$key] = $db->real_escape_string($val);
    51.         // Формируем новое значение обратно в xfields
    52.         $tmp = [];
    53.         foreach ($data as $key => $value)
    54.             $tmp[] = "$key|$value";
    55.         $new_xfields = implode("||", $tmp);
    56.         // Обновляем бд
    57.         $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'";
    58.         $update_result = $db->query($update_query);
    59.         if ($update_result)
    60.                echo "Данные успешно обновлены!";
    61.         else
    62.             echo "Ошибка при обновлении данных: " . $db->error;
    63.         //Закрываем соединение с базой данных
    64.         $db->close();
    65.     }
    66. }
    67. ?>
     
  9. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    я попробовал ваш код и после запуска ни одно значение не перезаписывается.
     
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    257
    Симпатии:
    50
    Адрес:
    Бавария, Германия
    Любой код нужно отлаживать.
    Для начало попробуйте проверить если запись с id в БД и добавить в код
    PHP:
    1. print_r($_POST);
    2. ...
    3. ...
    4. print_r($postVarIsset);
    5. if(count($postVarIsset) > 0 AND isset($_POST["id"]))
    6. {
    7.  
    8. ...
    9. ...
    10. // Получаем значения xfields
    11.     $query = "SELECT xfields FROM dle_post WHERE id='$id'";
    12.     $result = $db->query($query);
    13. var_dump($result );
    14. ...
    15. ...
    16. echo "$new_xfields, $id";
    17. // Обновляем бд
    18.         $update_query = "UPDATE dle_post SET xfields='$new_xfields' WHERE id='$id'";
     
  11. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    >В Ваше в коде остались две ошибки :
    >1. нет проверки переменных $_POST
    >2. если результат SELECT false, Вы делаете UPDATE

    в данном случаи код присланный мой ранее рабочий, только вы писали про 2 ошибки, в чем может быть проблема или угроза при перезаписи? Критично ли это?
     
  12. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    257
    Симпатии:
    50
    Адрес:
    Бавария, Германия
    Обе ошибки критичны.
    Если нет проверки переменных $_POST, то, если есть id, а других нет то в БД могут затираться значения.
    С этого Вы начали описание Вашей проблемы.
    Если id нет, то будут возникать SQL ошибка на SELECT и UPDATE
    В коде необходимо проверять всё и всегда.

    p.s. То что не критично, но весьма полезно - использовать в коде циклы, например,
    PHP:
    1. $postVar =
    2. [
    3.     'id',
    4.     'companies',
    5.     'price',
    6.     'total_phones',
    7.     'unique_email',
    8.     'mobile_numbers',
    9.     'site_compani'
    10. ];
    11.  
    12.  
    13. //это
    14. $new_companies = $db->real_escape_string($_POST['companies']);
    15. $new_price = $db->real_escape_string($_POST['price']);
    16. $new_total_phones = $db->real_escape_string($_POST['total_phones']);
    17. $new_unique_email = $db->real_escape_string($_POST['unique_email']);
    18. $new_mobile_numbers = $db->real_escape_string($_POST['mobile_numbers']);
    19. $new_site_compani = $db->real_escape_string($_POST['site_compani']);
    20.  
    21.  
    22. //можно записать так
    23. foreach($postVar as $val)
    24.     $$val = $db->real_escape_string($_POST[$val]);
     
  13. sotex2

    sotex2 Активный пользователь

    С нами с:
    28 сен 2019
    Сообщения:
    18
    Симпатии:
    0
    спасибо. тогда ничего переделывать не буду, пока работает.
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.753
    Симпатии:
    1.322
    Адрес:
    Лень
    в DLE должен быть инструмент для редактирования полей в таблице post. Очень сильно похож на Wordpress
     
  15. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    864
    Симпатии:
    134
    Бывают интересные вопросы, бывает нет, Ваш отнёс к последним, приношу извинение за излишнюю грубость.