• Почему игнорируется блок кода при подключении к бд?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос очень важный. Он показывает, насколько изменились подходы к программированию за четверть века.
    Вот этот детский лепет -
    spoiler
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
    echo "Connected successfully";
    }
    - происходит прямиком из прошлого века.

    С тех пор прошло уже 25 лет, а пехопа всё так и пишет РНР немного подрос, и проверять ошибки при работе с БД вручную стало не нужно. А чтобы увидеть ошибку, надо всего лишь включить вывод ошибок РНР. На домашнем сервере достаточно просто написать в начале скрипта

    ini_set('display_errors', 1);

    (и не забыть поставить 0, когда код поедет на боевой).

    Соответственно, блок кода "игнорируется" просто потому, что ошибка является фатальной, и выполнение скрипта останавливается, ещё до всех этих if ($conn.
    Ответ написан
    Комментировать
  • Как корректно искать по регулярным выражениям в SQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Документацию полезно иногда читать.
    В ней шрифтом по фону написано, что
    To use a literal instance of a special character in a regular expression, precede it by two backslash (\) characters. The MySQL parser interprets one of the backslashes, and the regular expression library interprets the other.
    Ответ написан
    1 комментарий
  • Как написать bash скрипт для ffmpeg большого количества файлов?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Непонятно, к чему столько телодвижений
    просто заходим в папку и выполняем в командной строке несложную команду
    for file in *.mp3; do ffmpeg -i image.jpg -i "$file" -acodec copy  "${file%.*}.mp4"; done


    Общий принцип "выполнить команду для всех файлов" легко гуглится. Единственная хитрость - обрезка расширения, но вполне можно было ведь и оставить.
    Ответ написан
    Комментировать
  • Как мне выводить из базы данных информацию по группам?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я только недавно начал изучать программирование

    Это очень похвально. Только ради бога, учите его по нормальным учебникам, а не по видеокурсам, которые делали неграмотные дети на мамкином ноутбуке.
    Примеры говнокода

    • unction selectAll1 - это глупость и говнокод. У функции должно быть осмысленное имя
    • ($table1 , $table2 , $table3 , $table4 , $table5){ - это глупость и говнокод. Учитывая, что функция в любом случае уникальная для используемых таблиц, передавать их в качестве параметров имеет 0 смысла.
    • global $pdo; - это глупость и говнокод. Потом сами не будете знать, что откуда взялось. Все параметры надо передавать в функцию явно.
    • dbCheckError($query); - это глупость и говнокод. Специально проверять запрос на ошибки не нужно. Надо написать один общий обработчик ошибок для всего сайта и любых ошибок.
    • <?=$contacts['filial']?> - это говнокод и дыра в безопасности. В любых данных, выводимых в HTML, должны экранироваться спецсимволы HTML


    Поскольку вы используете PDO, то можете сразу получить трехмерный массив, сгруппированный по одному полю
    function listContactsByDepartment ($pdo){
        $sql = "SELECT 
        t3.department, -- обращаем внимание на эту строчку. Она должна быть первой
        t1.id,
        t1.full_name,
        t1.email_user,
        t1.tel_number,
        t2.filial,
        t3.department_email,
        t4.position,
        t5.number
        FROM contact_work AS t1 INNER JOIN filial_work AS t2  ON t1. id_filial = t2.id 
        INNER JOIN department_work AS t3 ON t1. id_department = t3.id
        INNER JOIN position AS t4 ON t1. id_position = t4.id
        INNER JOIN number_work AS t5 ON t1. id_number = t5.id
        ORDER BY `t2`.`filial` ASC , `t3`.`department` DESC ";
        return $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP); # Обращаем внимание на эту константу
    }
    $contacts = listContactsByDepartment ($pdo);

    Из этой функции вы получите трехмерный массив, который выводится двумя вложенными циклами
    <?php foreach($contacts as $department_title => $department_contacts): ?>
                          <tr>
                            <td colspan=10><?=htmlspecialchars($department_title) ?>
                          <tr>
        <?php foreach($department_contacts as $row): ?>
                          <tr>
                            <td><?=htmlspecialchars($row['filial']) ?></td>
                            ...
                          </tr>
        <?php endforeach ?>
    <?php endforeach ?>
    Ответ написан
    Комментировать
  • Почему не сохраняется первый файл?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я думаю, что аффтар не справился с циклами. И подставляет телегу вперед лошади оба имени файла в первой же итерации. Тогда всё объяснимо:
    - и ВНЕЗАПНО возможность записи в несуществующий файл
    - и битвы бессмертных файлов, из которых останется только один

    В первой итерации файл не существует, потом создается первый загруженный файл с именем второго.
    И во второй итерации этот файл закономерно оказывается записываемым, и поверх него благополучно записывается второй.

    Если бы автор осилил сразу привести полный код, а не какой-то огрызок, то куча людей не потратила бы кучу времени на бессмысленные гадания.
    Ответ написан
    1 комментарий
  • Include не работает после переезда на другой хостинг?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    • include "https://сайт/include.php"; - это идиотизм, и не должно работать. и не будет. Можно сразу забыть и идти исправлять на нормальные пути. Будет гораздо быстрее чем ныть здесь.
      Можно попробовать заменить на include $_SERVER['DOCUMENT_ROOT']."/include.php"; если это свой сайт. Если чужой, то просто выкинуть эту строчку совсем. Ну или попробовать заменить на file_get_contents
    • include "include.php"; будут работать, если указать абсолютный путь. Хотя бы так,include __DIR__."/include.php";, но в некоторых случаях может не сработать
    • если инклюды "заработали" после добавления AddHandler application/x-httpd-php .php .html .shtml .htm в файл .htaccess, это значит, что не работали не инклюды, а не работал РНР в html файлах. Он как бы и не должен, но на этом кривом сайте видимо такое использовалось. В любом случае эта строчка никакого отношения к инклюдам не имеет.
    Ответ написан
  • Не подлючается mysql к dbeaver, что делать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нажмите на вкладку SSH
    (и не слушайте тех, кто начнет рассказывать про файрволл и прочие глупости)
    Ответ написан
    2 комментария
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что при работе через API запросы должны выполняться по одному, а не кучей.
    Все эти точечки с запятой предназначены для консоли, а через API с мультизапросами всегда будут проблемы (даже если у какого-то умника в его песочнице с куличиками проблем до сих пор не было).
    Потому что API предназначено для выполнения запросов по одному.

    Тем более что здесь нужно всего три запроса, а не 100500. Множественная вставка делается не так, а одним запросом. При этом, как нас учат в первом классе, запросы должны быть параметризованными а не вот это вот всё.
    Ответ написан
  • В чем ошибка SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Дополню предыдущий ответ правильным кодом, без вот этих всех бессмысленных телодвижений, которые понатыканы в исходном вопросе.
    $query = "UPDATE `users` SET `address`= ?,`phone_number`=?  WHERE email=?";
    $params = [
        $address,
        $phone_number,
        $email,
    ];
    $stmt = $pdo->prepare($query);
    $stmt->execute($params);

    Только орфографические ошибки в именах полей поправил
    Ответ написан
    Комментировать
  • Как можно использовать результат запроса из другого файла?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Прочтите внимательно вот это.
    После этого вам должны стать очевидны ошибки в ваших рассуждениях.

    Главный файл mainpage.php в котором использую объект XMLHttpRequest

    Не в файле mainpage.php, а в браузере. Никакого РНР и тем более его переменных там нет.

    мне нужно в файле mainpage.php повторно использовать результат запроса

    Не в файле mainpage.php, а в браузере. Никакого РНР и тем более его переменных там нет.
    А переменная яваскрипт с результатом запроса - есть. Вот её и используйте.

    Один global.php, в котором описана переменная: global $all_search;.

    А это, как я понимаю, просто бессмысленный файл, который можно смело удалить. Ну или только эту переменную, если там есть что-то ещё.
    Ответ написан
    Комментировать
  • Как взять каждое значение массива mysqli_fetch_array и занести каждое значение в строку таблицы mySQL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $id = $_SESSION['id'];
    $sql = "INSERT INTO zakaz (iduser,idkat) SELECT iduser, idkat FROM corzina WHERE iduser=?";
    $stmt = $bd->prepare($sql);
    $stmt->bind_param('i', $id); 
    $stmt->execute($res);

    Не очень понятно, впрочем, в чем смысл этого запроса. А точнее почему ни в корзине, ни в заказе нет количества товара, а в заказе не фиксируется цена.
    Ответ написан
    2 комментария
  • Какие есть годные альтернативы OpenServer?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Непонятно для чего оно вообще может быть нужно.
    Для продакшена - очевидно нет.
    Для профессиональной разработки - докер контейнер с рабочим окружением.
    Для того чтобы делать примеры из видеокурсов, достаточно запустить php -S localhost:80
    Ответ написан
  • Как решить проблему "Невозможно подключиться к серверу MySQL"?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вы проделали большую работу по отладке, но в этом деле важно не останавливаться.
    Вам mysql в логах человеческим голосом говорит, что она умерла и просит посмертно принять её в пионэры.

    То есть вопрос "как подключиться" становится немного бессмысленным: тут даже Штирлиц сообразит, что если базы нет, то подключиться к ней будет проблематично.
    И куда логичнее будет спросить "что делать, если mysql умерла?" Что, согласитесь, представляет собой совсем другой вопрос.

    Со стандартным, впрочем, ответом: берете сообщение об ошибке и гуглите его. Судя по количеству результатов, вы не единственная жертва любителей флажков. Читайте, пробуйте предложенное. Гуглите другие слова из логов. Перейдите по ссылке, которая в логе. Задайте другой вопрос в конце концов, в котором опишите актуальную проблему, а не симптом широкого профиля.

    Хотя лично я бы выкинул все эти куличики с флажками и окошками и либо поставил весь софт сам, либо взял докер-образ. Это куда полезнее, чем флажки тыкать.
    Ответ написан
    Комментировать
  • Почему не отправляются данные в базу данных?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
  • Array или Массив с данными?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    После внимательного чтения вопроса и комментариев, скорее всмего сработает

    CURLOPT_POSTFIELDS=> http_build_query($postdata),

    А если не поможет - то гуглить отправку джейсона курлом
    Ответ написан
  • Как решить проблему PDOStatement::execute(): SQLSTATE[HY093]?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Камрад alexalexes мыслит в правильном направлении, но как все новички, пишет очень много ненужного кода.
    Вот более простое решение, которое и можно рекомендовать в этом случае:
    $product_list = [30, 32, 38];
    // получаем строку вида ?,?,? по количеству эл-тов в массиве
    $placeholder_string = str_repeat('?,', count($product_list) - 1) . '?'; 
    $sql = "SELECT * FROM `products` WHERE `productId` in ($placeholder_string)";
    $query = $db->prepare($sql);
    $query->execute($product_list); 
    $products_data = $query->fetchAll(\PDO::FETCH_ASSOC);
    Ответ написан
    Комментировать
  • Как решить ошибку Warning: mysqli_connect(): (HY000/2002): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Перед тем, как пытаться подключиться к серверу MySQL, его надо запустить.
    Если вы понятия не имеете, что такое сервер MySQL, то ищите нужную кнопочку в своей панельке управления, которая за вас решает, какие программы вам нужны.
    Ответ написан
    Комментировать
  • Как получить часть URI, которая идёт после основного домена?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Проблема в идиотских руководствах из прошлого века.
    Ну и в том, что вы не понимаете даже их. И воображаете, будто $_GET['q'] - это некая волшебная переменная, которая содержит "URI".
    Но содержит она его только если использовать .htaccess, причем с идиотской инструкцией, которая отправляет в РНР те данные, которые в нем и так есть.
    В современном же мире наличие как файлика .htaccess, так и идиотских инструкций в нём, совсем не гарантировано.
    И получать запрошенный URI надо нормальным способом, о котором написал AUser0 - через специально предназначенную для этого переменную.
    if($conn->connect_error) {
        die("Ошибка соединения: " . $conn->connect_error);
    }

    - это еще один пример бессмысленного говнокода из прошлого века.

    Ну и роутинг на вложенных свитчах вместо нормального - это совсем за гранью добра и зла.
    Ответ написан
    1 комментарий
  • Как переорганизовать базу данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для начала надо познакомиться с какими-то типами полей кроме TEXT
    Например, вместо ТРЕХ колонок day, date и time надо сделать ОДНУ, типа datetime.

    "объединить таблицы с одинаковыми параметрами в одну таблицу, добавив флаг для их различия" - это правильное решение. То есть вместо двух таблиц с логами должна быть одна, вида
    user_id INT (сюда пишется id из таблицы юзеров)
    log_type_id INT (сюда пишется id из таблицы с описаниями логов - название там и прочее)
    host VARCHAR
    dtm DATETIME
    session VARCHAR
    Ответ написан
    Комментировать
  • Как автоматически подставлять значение в value?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Начинающие очень часто делают глупости. И записывать в базе данных количество строк в ней - одна из них.
    Точно так же, как вы сейчас получаете количество через SELECT COUNT(*), это можно будет сделать в любой момент времени потом. И ничего никуда подставлять не надо.

    Плюс $table_name выглядит еще одной глупостью. Имя таблицы не должно быть динамическим.
    Ответ написан
    9 комментариев