Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • Как передать переменную в другой файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    форму с кнопкой отправить делать не хочу,

    Хотелки и капризульки оставляем дома. После этого вооружаемся знаниями и технологиями.

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

    После того как ты освоишь стандартный вариант с презагрузкой, и он, наконец, заработает - можешь попробовать освоить технологию AJAX для того чтобы сделать без перезагрузки.
    Ответ написан
    8 комментариев
  • Как правильнее отобразить XML на сайте постранично?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Где и как лучше сохранять сам файл?

    В базе данных.
    Ответ написан
    5 комментариев
  • Как правильно разработать легкомасштабируемую платёжную систему?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Найти финансирование, от $10M
    2.Нанять команду профессионалов.

    Да, а школу сначала все-таки надо будет закончить.
    Ответ написан
    Комментировать
  • Доверять или не доверять?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Фильтровать какие-либо данные вообще очень редко требуется.
    Чаще всего надо форматировать их. В зависимости от того, куда данные отправляются.

    Вопрос же "доверия" решается просто - никаким источникам доверять нельзя.
    Ответ написан
    5 комментариев
  • Не пойму, в чем проблема при авторизация с сессией на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нагуглил лишь то, что session_start(); должен быть в начале кода, но и это не помогает.

    Помогает.

    Вспомнил. Скорее всего, это BOM гадит.
    Надо сохранять файл в кодировке UTF-8 without BOM, а лучше вообще сменить редактор на что-нибудь пристойное, с подсветкой кода хотя бы.
    Ответ написан
  • Как через action подгрузить php в определенном диве?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    "Подгрузить РНР в диве" невозможно. В диве можно подгрузить только HTML.
    Ответ написан
  • Как правильно реализовать ООП класс базы данных с PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я уже отвечал как-то на подобный вопрос. И не один раз. И не два.
    Поскольку мозги всех пользователей пхп ходят по одним и тем же рельсам, не сворачивая. Впрочем, не всех. 85% всю жизнь продолжают писать mysl_query, которую выучили из видеоурока, и не видят в этом проблем. И только у самых талантливых 15-и процентов в какой-то момент возникает мысль ВСЁ АВТОМАТИЗИРОВАТЬ. Это, на самом деле, хороший знак. Такое желание как раз и отличает потенциального программиста от клепальщика гуано-кода.

    Но всё портит недостаток знаний в SQL. Искренне полагая SQL не более чем key-value хранилищем, они всерьез уверены в том, что функция select() с двумя аргументами - это все что им надо.

    Настоятельно рекомендую прочесть аргументацию по ссылке выше.

    После этого понять, что существует ТРИ класса классов для работы с БД:

    1. DB-хелпер. Класс, берущий на себя всю грязную работу по исполнению запросов. В случае с ПДО не сильно-то и нужен. Позволяет исполнять любые запросы. НИКАКИХ функций типа select(), ограничивающих функциональность, в нем быть не должно ни в коем случае.
    2. Query builder. Функция типа select() может быть только в квери билдере, который маскирует SQL в функции РНР. Заведомо ущербен по сравнению с первым, но зато позволяет использовать запросы более сложные, чем ORM.
    3. ORM. То, что начинающему пользователю на самом деле нужно, но он об этом просто не догадывается. Как раз та самая волшебная палочка, которая делает примитивное доставание данных из базы по первичному ключу столь маняще единообразным.

    Cамое главное, что надо понять:
    Все вышеперечисленное - это РАЗНЫЕ типы классов, не имеющие между собой ничего общего.
    И не пытаться под видом первого городить нежизнеспособное второе, имея в виду третье. Надо очень четко понимать, что сначала делаем первое, а потом, на его основе - либо второе, либо третье. Но не все вместе.

    А можно не пытаться изобретать велосипед, а использовать готовое. Например - популярный фреймворк. Тогда желаемая функция будет выглядеть вот так:

    public function viewUser($id)
    {
        return User::model()->findByPk($id);
    }

    Это в самом предпочтительном случае - при использовании ORM.
    На квери билдере это будет что-то вроде
    public function viewUser($id)
    {
        return DB::select('*')->from('users')->where("id", '=', $id);
    }


    При этом можно использовать и чистый SQL. Запрос прямо в классе юзера - это не так уж и страшно. Тем более, что есть такие запросы, которые по другому просто не выполнишь. Другое дело, что всю работу по исполнению запроса должен брать на себя хелпер. Пример можно посмотреть по ссылке выше - там хоть и SQL , но того ужаса, который здесь, нету:
    public function viewUser($id)
    {
        $sql = 'SELECT * FROM users WHERE id=?';
        return DB::prepare($sql)->execute([$id])->fetch();
    }
    Дальнейшую работы над классом можно производить только после того как ты определишься, какой именно класс ты хочешь написать.
    Ответ написан
  • Что может быть не так с insert mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    ооооооо! Очередной боретс с ужасными инъекциями применяет секретное хакерское кодирование.
    Ответ написан
  • Как поймать ошибку соединения MySQLi?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Запоминаем волшебную строчку для работы с mysqli:
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Писать перед коннектом.
    Отлавливает ошибки не только коннекта, но и запросов.

    А функцию error_handler() надо выкинуть - она вредная и ненужная.
    Равно как и идея писать ошибки БД в базу данных.
    Не надо выпендриваться. Пишите в лог как все.
    Ответ написан
    5 комментариев
  • Как узнать, выполнился ли запрос в PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я спрашивал уже, и спрошу снова: ЗАЧЕМ?

    Зачем ты хочешь проверять успешность выполнения запроса и что ты потом будешь с этим сакраментальным знанием делать?

    Кстати,
    (при UPDATE, INSERT и т.д.)

    Как я уже писал, при UPDATE, INSERT и т.д. твоя функция всегда будет выдавать ошибку. Можно даже не проверять
    Ответ написан
    Комментировать
  • Как сортировать многомерный массив в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    php.net/usort - функция для сортировки чего угодно как угодно.

    А вообще данные надо сортировать в базе.
    Ответ написан
  • Возможно ли изменить информацию о песне (mp3) PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    google.com/search?q=php+mp3

    Во всех современных браузерах можно не писать адрес сайта а просто вбить в адресную строку два слова: php mp3
    Для более точноно поиска можно добавить третье слово, "запись"

    Не благодарите.
    Ответ написан
    Комментировать
  • Как трансформировать текст более коротко?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Задачу не понял от слова совсем, но если отталкиваться от условия "кодировать покороче", то можно сделать так:
    function incode($string) {
    	return $string;
    }

    вместо 108710881080108410771088 вернёт "пример" - в 2 раза короче.
    Ответ написан
  • Как в PDO значение LIMIT при запросе сделать INT?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хороший вопрос. Как раз показывает убогость стандартной системы плейсхолдеров.
    В моей библиотеке для работы c MySQL тип указывается самым простым и эффективным способом - прямо в плейсхолдере:
    //первый запрос (лимит здесь не нужен)
    $id = $db->getOne("SELECT id FROM users WHERE mail = ?s AND pass = ?s", $mail, $pass);
    // второй запрос
    $sql  = "SELECT id, name FROM news WHERE category = ?s AND subcategory = ?s LIMIT ?i";
    $news = $db->getIndCol('id', $sql, $cat, $subcat, $limit);

    Как видно из этих примеров, тип ставится в самом плейсхолдере и все входящие данные обрабатываются корректно.

    Вернемся теперь к несчастному PDO.
    Цикл с подстановкой в bindParam?

    Цикл, увы, не поможет. Потому что мы не знаем, какой тип использовать для привязки. То есть, все сведется к дефолтному PARAM_STR и в итоге мы получим то же самое execute() с массивом, только в профиль.
    Если вдруг возникнет идея определять тип по составу переменной, то делать это НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ. Если бы мог, я бы выделил ещё большим шрифтом и красным цветом. Потому что практически каждый продвинутый пользователь похапе рано или поздно наступает на эти грабли. Если число, хранящееся в MySQL, всегда можно безопасно сравнивать со строкой, то наоборот - это будет катастрофа: MySQL будет пытаться привести содержимое поля к числу. То есть, если взять пример из вопроса, и пытаться определить тип привязки по содержимому переменной, то при введенном пароле 12345 ctype_digit() скажет нам использовать INT и в итоге пароль 12345 подойдет к любому паролю вида "12345буквы".
    Так что цикл - не вариант.

    Я читал, что можно еще отключить режим эмуляции, но я не знаю, как это повлияет на безопасность

    Режим эмуляции на безопасность не влияет. Некоторые неграмотные разработчики считают, что отключение режима эмуляции повышает безопасность, но это неправда. В обоих вариантах PDO работает одинаково безопасно.
    В любом случае, отключение эмуляции действительно решает проблему. Так что в данном случае это будет самое простое решение.

    Так что либо в параметрах DSN, либо с помощью
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

    отключаем эмуляцию и наслаждается лимитом (правда, в этом случае перестанет работать такая фича, как несколько именованных плейсхолдеров с одним и тем же именем, но тут уж приходится выбирать).

    И последнее замечание.
    Функцию для выполнения запросов писать в общем-то нет смысла. PDO достаточно лаконичен и сам по себе. Единственное, что мешает писать однострочники - это дурацкая execute(), которая возвращает не себя, а булево значение. Но это легко исправить, и в итоге код получится ненамного длиннее, чем при вызове функции, но гораздо более гибким (ненавижу скроллинг, поэтому выношу параметры на другие строчки):
    // с функцией
    $sql   = 'SELECT `user_pass` FROM `users` WHERE `user_mail` = :mail LIMIT :lim';
    $param = array(':mail' => 'vlad-dub1994@mail.ru', ':lim' => 1);
    $data  = select($sql,$data);
    // с патченым PDO
    $data = DB::prepare($sql)->execute($data)->fetch();
    
    // или другой вариант записи
    $data = DB::prepare('SELECT user_pass FROM users WHERE user_mail = :mail LIMIT :lim')
    	->execute([':mail' => 'vlad-dub1994@mail.ru', ':lim' => 1])
    	->fetch();

    Всего на пару слов больше, но зато можно исполнять любые запросы (INSERT к примеру):
    $sql   = 'INSERT INTO users VALUES(?,?,?)';
    $param = array(NULL, 'vlad-dub1994@mail.ru', 'pass');
    DB::prepare($sql)->execute($data); //OK
    select($sql,$data); // ошибка из-за fetch()

    и использовать любые варианты получения данных, которые поддерживает PDO:
    $sql = 'SELECT id FROM tree WHERE parent_id=?';
    $subcat = DB::prepare($sql)->execute([$parent])->fetchAll(PDO::FETCH_COLUMN);
    Ответ написан
    1 комментарий
  • Где найти официльное описание display_template(ссылку бы)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Спрашивать надо свой собственный код.
    Поиском по файлам подстроки "function display_template" найдется за пару секунд
    Ответ написан
    Комментировать
  • Книги по php с описанием работы с PDO и SQLite на русском языке?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По SQLite не нужна книга, если планируется использовать PDO. Там, где есть PHP, всегда есть и нормальная база данных, и нет смысла пользоваться игрушечной.

    По PDO не нужна книга, поскольку это очень маленький API, буквально из 5 функций.
    Всё что нужно знать про PDO:

    1. Любые переменные должны попадать в запрос только через плейсхолдер. Поэтому все запросы, в которых участвуют переменные, должны выполняться через prepare/execute: сначала запрос подготавливается через prepare(), причем вместо переменных должны стоять плейсхолдеры, такие ? или такие :name. А переменные потом передаются через execute.
    $pdo  = new PDO ( ... );
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
    $stmt->execute([$_GET['id']]);
    $user = $stmt->fetch();

    2. Для получения данных есть три функции
    - fetch() получает строку. аналог mysql_fetch_array()
    - fetchAll() получает массив строк. Синтаксический сахар для while ($row = mysql_fetch_array()) (эта функция, кстати - единственная, по которой стоит почитать мануал. у неё есть несколько интересных кунштюков)
    - fetchColumn() - синтаксический сахар для $row = mysql_fetch_row(); $flag = $row[0]

    3. Все остальные тонкости и нюансы описаны по-русски здесь: www.phpfaq.ru/pdo

    4. Особые надстройки над PDO не нужны, но иногда хочется исправить пару неудобных вещей. Например, с помощью www.phpfaq.ru/pdo_wrapper код из п.1 сократится до одной строчки (причем код будет работать отовсюду и сразу):
    $user = DB::run("SELECT * FROM users WHERE id=?", [$_GET['id']])->fetch();

    5. По любым другим вопросам можно спрашивать меня
    Ответ написан
    Комментировать
  • Как внести изменения записи в БД, на SQL PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Покажи человеку, который писал этот код, вот эту ссылку: phpfaq.ru/debug
    Пусть прочтет и попытается понять.
    Ответ написан
  • Не работает подключение файлов в PHP. Как настроить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Начинающим пользователям действительно бывает сложно понять концепцию файловой системы, иерархических каталогов, понятие текущего каталога и отличие относительного пути от абсолютного.
    Рекомендую почитать вот это: phpfaq.ru/paths

    Для данного случая может помочь путь
    $_SERVER['DOCUMENT_ROOT'].'/ext/mail/PHPMailerAutoload.php';

    впрочем, гарантировать нельзя, поскольку мы не знаем, где лежит папка ext

    Подсказка на будущее:
    Сообщение об ошибке надо приводить сразу. И целиком.
    Ответ написан
    Комментировать
  • Как посчитать количество запросов к базе данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Учитывая, что цифра совершенно бессмысленная, проще всего будет сделать
    echo rand(10, 15);
    Ответ написан
    3 комментария
  • Предотвратить SQL Injection без использования bindParam?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    С помощью небольшой магии и короткого синтаксиса код можно еще больше сократить
    $sql = 'SELECT * FROM users WHERE email = ?';
    $rows = $db->prepare($sql)->execute([$email])->fetchAll();
    Ответ написан
    Комментировать