За последние 24 часа нас посетили 16618 программистов и 1651 робот. Сейчас ищут 1717 программистов ...

Не добавляет статью в базу данных

Тема в разделе "PHP для новичков", создана пользователем dmitrij.buck, 28 мар 2018.

  1. dmitrij.buck

    dmitrij.buck Новичок

    С нами с:
    9 мар 2018
    Сообщения:
    15
    Симпатии:
    0
    Я новичок.Выдает ошибку
    Warning: mysqli_query(): Couldn't fetch mysqli in D:\server\Data\htdocs\nails\admin\add_post.php on line 56

    Warning: mysqli_error(): Couldn't fetch mysqli in D:\server\Data\htdocs\nails\admin\add_post.php on line 56

    Подскажите в чем может быть проблема?


    <?php

    // подключаем БД
    require_once 'blocks/bd.php';
    //достаем из глобального массива ПОСТ переменные
    if (isset($_POST['title'])){$title = $_POST['title'];}
    if (isset($_POST['meta_k'])){$meta_k = $_POST['meta_k'];}
    if (isset($_POST['meta_d'])){$meta_d= $_POST['meta_d'];}
    if (isset($_POST['author'])){$author=$_POST['author'];}
    if (isset($_POST['date'])){$date=$_POST['date'];}
    if (isset($_POST['discription'])){$discription=$_POST['discription'];}
    if (isset($_POST['text'])){$text=$_POST['text'];}


    // закрываем подключение
    mysqli_close($link);

    ?>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head></head>
    <body>
    <div class=”contents”>


    <?php
    if (isset($title) && isset($meta_d) && isset($meta_k) && isset($date) && isset($author) &&
    isset($discription) && isset($text)){
    // запрос на добавление строк в таблицу
    $query = "INSERT INTO posts (title,meta_d,meta_k,date,author,discription,text)
    VALUES ('$title','$meta_d','$meta_k','$date','$author','$discription','$text')";
    //вывод результата запроса в переменную
    $result=mysqli_query($link,$query) or die("Ошибка " . mysqli_error($link));

    if ($result == 'true'){
    echo "<p>Ваша статья добавлена на сайт</p>";
    }
    else {echo"<p>Ваша статья не добавлена на сайт</p>"; }
    }


    else{ echo "<p>Вы не заполнили все поля</p>";}
    ?>

    </div>
    </body>
     
  2. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    502
    Симпатии:
    58
    Ты сначала соединение закрываешь, а потом в базу пытаешься записать? :eek:
    PHP:
    1. // закрываем подключение
    2. mysqli_close($link);
    3. .......
    4. // запрос на добавление строк в таблицу
    5. $query = "INSERT INTO posts (title,meta_d,meta_k,date,author,discription,text)
    6. VALUES ('$title','$meta_d','$meta_k','$date','$author','$discription','$text')";
    7. //вывод результата запроса в переменную
    8. $result=mysqli_query($link,$query) or die("Ошибка " . mysqli_error($link));
    Не фильтруешь и не экранируешь данные, которые идут в запрос.
    Используй хотя бы функцию mysqli_real_escape_string перед отправкой sql запроса.
    А то только ленивый не сможет взломать твою базу и сайт.
    http://komotoz.ru/uroki/php/mysqli_real_escape_string.php
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Сначала закрываем соединение потом делаем запрос?

    У вас все принципиально неправильно сделано. В двух словах:
    - разделяем добавление и вывод между HTTP-запросами;
    - никаких запросов после начала вывода.

    1. Добавили и инициировали редирект методом GET либо на /dest?status=ok, либо на /dest?status=error (адреса условные) в зависимости от результата выполнения запроса к БД.
    2. На странице /dest вывели осн. инфу плюс сообщение, если указан параметр status.

    «Порождать» сообщение об ошибке можно не только через адресную строку. При возникновении ошибки допустимо делать вывод в ответ на POST, чтобы иметь возможность выводить контент в форме и детальное сообщение об ошибке безо всяких передач. Есть гораздо более продвинутый способ вывода контента в форме – разделить создание на собственно создание записи с дефолтными значениями и следующее за ним автоматом (при помощи все того же редиректа) редактирование в случае успешного создания записи.
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    https://en.wikipedia.org/wiki/Post/Redirect/Get
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Эээ... как пост yanuzay вклинился перед моим? Он его десять часов что ли писал? Ну вот собственно пример того, о чем я выше писал: сначала забивается место, потом выполняется сохранение фактических данных :)
     
  6. dmitrij.buck

    dmitrij.buck Новичок

    С нами с:
    9 мар 2018
    Сообщения:
    15
    Симпатии:
    0
    Спасибо Всем, кто сделал замечания.Конечно принципиальная проблема была в закрытии соединения с базой.буду совершенствоваться.
     
  7. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    502
    Симпатии:
    58
    соррян ребят(
    Зашел на форум на вопросы ответить, уснул за компом.
    Утром запостил ответ не обновив страницу)
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    о, нет... есть магия по-страшнее. например, ты не можешь запостить статью, в тексте которой есть кавычка...
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Это просто косоглазие :) Принципиальные проблемы и способы их решения я вам описал. Также не забываем про экранирование данных в запросе, о чем упоминали два др. товарища, и про кодирование HTML-сущностей при выводе данных в форму.