Задать вопрос
  • Возможно ли восстановление битого пикселя?

    @kisaa
    Если транзистор не окончательно вышел из строя - можно попробовать "расшевелить" его периодической многократной сменой цвета этого пикселя (в Убунту, помню, был даже скринсейвер подобный, выводящий на экран ползущие черно-белые полосы). Некоторые источники упоминают мягкий физический массаж этого места на матрице (ногтем пальца) - осторожно, никаких гарантий!
    Ответ написан
    Комментировать
  • Как сделать prepare запрос без bind_params?

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

    Можно ли как-то безопасно сделать такой запрос, который я соберу в строку?

    Нет, нельзя.

    Это распространённое, но очень смешное заблуждение. Если подумать, то само по себе prepare() ни от чего не защищает. Это не волшебное слово типа "Экспекто патронум!" - написал, и дальше уже можно не париться, оно само как-то магически защитит от инъекций. В реальной жизни таких слов ещё, увы, не придумали. А защищает именно замена актуальных переменных в запросе на знаки подстановки и последующая привязка через bind_param. А prepare просто говорит базе данных ,что запрос еще рано исполнять, это только схема запроса, а данные для него приедут позже.

    Я так понял, что если я выполняю $sql = $mysqli->prepare($request), то выполнится только один запрос, который первый, даже, если в него вложен будет второй, пусть я его строкой и засунул.

    Это тоже очень распространённое, и очень вредное заблуждение. Запрос выполнится только один, да. Тут всё верно. Но проблема в том, что SQL инъекция - это не один запрос
    INSERT INTO students (name) VALUES ('Robert');DROP TABLE students;
    , который рисуют в примерах для первоклассников. Инъекция - это любой посторонний код в запросе, вообще любой.

    Поэтому собирать в строку надо всё равно запрос со знаками подстановки, а потом его выполнить. Благо, в 5.6 версии пхп появился оператор распаковки параметров, который значительно облегчил эту задачу.

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

    Без переменных тут не обойтись, но вот с типами данных можно не запариваться. Исторически mysql всегда спокойно принимает строки для любых типов данных. Исключений настолько мало, что ими можно пренебречь.

    Для запроса, который приведен в примере, код будет относительно простым, поскольку заменяется на вызов IN:

    $names = ["Stepan" , "Stiv"];
    $in    = str_repeat('?,', count($names) - 1) . '?'; // получаем строку вида "?,?"
    $sql   = "SELECT * FROM users WHERE name IN ($in)"; // поставляем её в SQL
    $stmt  = $mysqli->prepare($sql); // prepare
    $types = str_repeat('s', count($names)); // получаем строку "sss" по количеству переменных
    $stmt->bind_param($types, ...$names); // привязываем наш массив
    $stmt->execute(); // выполняем
    $result = $stmt->get_result(); // дальше всё как обычно
    $data = $result->fetch_all(MYSQLI_ASSOC);


    Для более сложных запросов принцип будет тот же: собираем строку с плейсхолдерами, а переменные для неё - в массив. И потом выполняем так же через bind_param($types, ...$parameters);, как-то так:

    $conditions = [];
    $parameters = [];
    if (!empty($_GET['name']))
    {
        $conditions[] = 'name LIKE ?';
        $parameters[] = '%'.$_GET['name']."%";
    }
    // любое количество таких условий
    if ($conditions)
    {
        $sql .= " WHERE ".implode(" AND ", $conditions);
    }

    и дальше выполняем обычным порядком.

    Ну и в завершение, ответим на вопрос из заголовка буквально
    Как сделать prepare запрос без bind_params?

    Как правильно заметил TheAndrey7 в комментариях, начиная с версии 8.1 можно будет отправить переменные сразу в execute():

    $names = ["Stepan" , "Stiv"];
    $in    = str_repeat('?,', count($names) - 1) . '?';
    $sql   = "SELECT * FROM users WHERE name IN ($in)";
    $stmt  = $mysqli->prepare($sql); 
    $stmt->execute($names); 
    $data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    Ответ написан
    4 комментария
  • Возможно ли восстановление битого пикселя?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Битый пиксель - это фактически, сгоревший транзистор в матрице. Ничего вы с ним не сделаете.
    Очевидно, что он не попадает на скриншот, потому что проблема находится именно в матрице дисплея, а не в видеопамяти.
    Ответ написан
    Комментировать
  • Если в проекте есть докер файл, то я могу запустить его на любой ос?

    2ord
    @2ord
    Dockerfile может иметь инструкции для сборки как Linux, так и Windows контейнеров. Для запуска контейнера нужно убедиться, что соответствует аппаратная архитектура контейнера и ОС. Бывает, что контейнеры собираются для множества архитектур одновременно.

    Контейнеры Linux можно собрать и запустить в Linux, MacOS, Windows. Контейнеры Windows, если не ошибаюсь, можно запустить только в Windows.

    Так что если речь про контейнер Linux, то, как правило, это архитектура amd64. А значит, для запуска контейнера подойдет любой Linux с процессором архитектуры amd64 (server/desktop).

    Перед запуском контейнера автоматически устанавливаются недостающие слои. В контейнере принято запускать единственный процесс (порой супервизора процессов).
    Например, нужны 2 контейнера: старого приложения на PHP 5 и сервера Mysql 5.5. Тогда в Dockerfile приложения контейнера описывается на каком образе основано приложение (допустим, версия фреймворка) и тогда разработчик с помощью Docker собирает контейнер и запускает его.
    Обычно для запуска нескольких контейнеров пишут сценарий для запуска в Docker Compose, в котором описываются различные контейнеры, необходимые для работы приложения и то как они обращаются друг к другу.

    И, вообще, есть много ответов в Хабр Q&A и много статей в интернете.
    Ответ написан
    Комментировать
  • Как сделать нулевой отступ при display:none?

    @jsnk
    Программист
    Помести блок в div и none делай у него
    Ответ написан
    Комментировать
  • Как сделать нулевой отступ при display:none?

    SagePtr
    @SagePtr
    Еда - это святое
    Всё прекрасно исчезает:
    Ответ написан
    1 комментарий
  • Можно ли передавать изображения в json?

    Alexandroppolus
    @Alexandroppolus
    кодир
    base64
    Ответ написан
    Комментировать
  • Почему функция не видит переменную?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    А кто текст ошибки будет читать?
    Uncaught TypeError: [1,2,3] is not a function

    Лучше всегда использовать точку с запятой, чтоб таких ошибок не было.
    Конкретно тут возникает ситуация, что круглые скобки вокруг функции являются продолжением выражения с массивом, то есть работает это по сути так:
    let map = [1, 2, 3](async () => {
    	console.log(map)
    })()
    Ответ написан
    Комментировать
  • Почему sort не работает по буквам?

    @Everybody_Lies
    Ответ написан
    Комментировать
  • Как отследить событие paste?

    Попробуйте с timeout(function(){}, 0);
    Проблема в том, что этот эвент триггерится до непосредственной вставки текста, а не после обновления значения. Для этого и нужен таймаут.
    Ответ написан
    1 комментарий
  • Как из строкового object получить value?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    e.target.textContent
    У ячейки таблицы никакого value нет.
    Ответ написан
    2 комментария
  • Как сделать регулярное выражение с проверкой наличие 2 и более условий в ъаотичном порядке?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Одной регуляркой никак.
    Но вы можете строку отсортировать по буквам
    var sortAlphabets = function(text) {
        return text.split('').sort().join('');
    };


    И уже к отсортированной строке регулярка будет простая, типа .*[0-9]{4.}.*[a-zA-Z]{5,}.*
    Ответ написан
    Комментировать
  • Как в данном примере изменить стили через ~?

    Pavel-ww
    @Pavel-ww
    На чистом css это не возможно, во всяком случае пока. Ждем имплементации браузерами псевдо класса :has.
    Без js не обойтись в общем
    Ответ написан
    2 комментария
  • Как в данном примере изменить стили через ~?

    Seasle
    @Seasle Куратор тега CSS
    Пока никак в CSS, но возможно, в скором будущем будет похожее поведение.
    Ответ написан
    Комментировать
  • Мы можем работать с map так же, как с массивом?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Map ничего общего не имеют с массивами, они реализуют совершенно другую структуру данных - хэш таблицу

    От объектов так же есть отличия:
    - У объектов в качестве ключа может быть только строка или символ, у Map - любой тип
    - Map под капотом всегда представлены как OrderedHashMap (упорядоченная хэш таблица), объекты представлены той же структурой данных, но в отличии от Map после оптимизации могут быть представлены в виде обычных сишных структур, где нужное поле получается по смещению от указателя.
    - Для манипуляции с объектами есть множество синтаксического сахара (вроде оператора in или spread (...) оператора), и оптимизатор знает об этом сахаре. У Map есть только его методы, с которыми оптимизатор может сделать не так уж и много (так как некоторые оптимизации не применимы к динамическому диспатчингу, ибо ведут к UB, а JS - язык с гарантированным отсутствием UB)
    Ответ написан
    2 комментария
  • Возможно ли написать аналог bind без apply?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Смотри мой ответ на этот вопрос.
    Если же вопрос на самом деле "без apply и call" - ответ: нет. Тебе надо как-то устанавливать контекст.
    Ответ написан
    8 комментариев
  • Почему анимация через функцию не плавная?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    setTimeout не дает точного запуска функции через указанное количество миллисекунд,
    поэтому для анимаций, вместо setTimeout используйте window.requestAnimationFrame;

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

    Ответ написан
    2 комментария
  • Почему в тернарный оператор нельзя положить цикл?

    Lynn
    @Lynn
    nginx, js, css
    Потому что цикл это не выражение (expression), а инструкция (statement). Тернарный оператор требует что бы все операнды были выражениями.
    Ответ написан
    Комментировать