@ozerovlife

Почему в базу данных попадает путь без слэшей?

Отправляю в базу путь к картинке:
$uploaddir = __DIR__ .  '/assets/img/';
$base_name = basename($_FILES['userfile']['name']);
function query_Event($base_name,$uploaddir,$mysql){
    $title = $_POST['title_text'];
    $discription = $_POST['discription_text'];
    $date = $_POST['date_text'];
    $path = $uploaddir . $base_name;

    if(isset($_POST['title_text']) AND isset($_POST['discription_text']) AND isset($_POST['date_text'])){
        $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES ('$title', '$discription', '$date', '$path') ";
        $res = mysqli_query($mysql, $sql);
    }
    else echo 'Произошла ошибка запроса в базу данных';
}
query_Event($base_name,$uploaddir,$mysql);

Но уже в базе почему то путь отображается вот так:

D:Programs-installedOpenServerdomainsq.q/assets/img/2.jpeg

Вместо:

D:Programs-installed/OpenServer/domains/q.q/assets/img/2.jpeg
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
потому что данные в БД надо добавлять по-человечески, а не как пацаны в подворотне показали.

Данные в БД надо всегда отправлять отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
Для этого надо
  • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
  • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
  • Привязать переменные к запросу.
  • Выполнить подготовленный ранее запрос с помощью с помощью execute()

В mysqli это будет так
$sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->bind_param("sssss", $title, $discription, $date, $path);
$stmt->execute();

bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute
$sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->execute([$title, $discription, $date, $path]);

И скажи спасибо что у тебя просто слеши пропали, а не всю базу шутники удалили
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы