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

    Краткая запись тэгов PHP <? code... ?> не рекомендуется к использованию.
    Дело в том, что директива short_open_tags по-умолчанию выключена, рекомендованные значения для любого окружения (Production/Development) = Off

    Short Echo
    <?= 'text' ?>
    Как уже правильно заметили, сокращённая запись <?php echo 'text' ?> и не требует включенной опции short_open_tags (с версии 5.4)

    Если подытожить:
    Хорошо
    <?= 'text' ?>
    <?php $i = 0; echo 'text'; ?>

    Плохо
    <? $i = 0; echo 'text'; ?>
    Ответ написан
    Комментировать
  • Возникла ошибка с подготовленными запросами, в чем проблема?

    Доброго дня.

    1.
    mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in

    Говорит нам о том, что первый параметр не является экземпляром класса mysqli_stmt и ошибку следует искать выше. скорее всего на этой строчке $sql равен false

    2. Пойдём немного выше и добавим отладку после строки
    $sql = mysqli_prepare($con, "INSERT INTO table VALUES (?, ?,?)");
    // debug
    if (!($sql instanceof mysqli_stmt)) {
       die($con->error);
    }

    Это сработает, если ваше соединение с базой данных установлено без ошибок.

    3. Добавляем отладку соединения с БД
    Найдите строчку, содержащую $con = mysqli_connect и добавьте после неё отладку
    if (!$con) {
        die('Connect Error: ' . mysqli_connect_error());
    }
    Ответ написан
    Комментировать
  • Как передать анонимной функции список аргументов?

    Вариант 1
    function doSomething($url, Closure $callback)
    {
        // собираем параметры из url
        $p1 = 1;
        $p2 = 2;
        
        // найдём переменные с указанными именами
        // и упакуем их в массив 'название перменной' => 'значение'
        $params = compact('p1', 'p2');
        
        $callback($params);
    }
    
    $callback = function ($params)
    {
        // распакуем массив
        extract($params);
        
        // теперь нам доступны переменные из вызывающей функции с теми же именами
        print_r($p1);
        print_r($p2);
    };
    
    doSomething('url', $callback);

    Результат: 12

    Вариант 2.
    Использовать оператор spread php.net
    function processor (...$params) {
        //
    }
    Ответ написан
  • Не работает mysqli_stmt_get_result после mysqli_stmt_num_rows?

    Доброго утра.

    С подготовленными выражениями не всё так просто, если использовать mysqli* (процедурный или объектный стиль).
    В вашем случае придётся разобрать, что именно написано:
    $q = "SELECT name, last_name, email FROM users WHERE id IN (?, ?)";
    
    $stmt = mysqli_prepare($link, $q);
    if (false === $stmt) {
        die('statement was executed with errors');
    }
    
    $id = 1;
    $anotherId = 2;
    
    //обратите внимание на строку типов - "ii",
    // подозреваю, что у вас ошибочно описан строковый тип "s" для id_user 
    $stmt->bind_param("ii", $id, $anotherId); 
    $stmt->execute();
    
    $stmt->store_result(); // буферизация
    echo "<br>Rows: " . $stmt->num_rows . "<br>"; // количество строк в результате
    
    // При работе с подготовленными выражениями и результатами нам нужно точно знать, что мы получаем в запросе (см. SELECT <fields>)
    // Можно получать в запросе все атрибуты, а конкретные имена атрибутов забирать через metadata
    $name = null;
    $lastName = null;
    $email = null;
    
    // Привязка переменных к результирующему набору (порядок, как в SELECT)
     $stmt->bind_result($name, $lastName, $email);
    
    // каждый вызов fetch будет связывать наши переменные и дынными из результата
    while ($stmt->fetch()) {
        var_dump([
            'name' => $name,
            'last_name' => $lastName,
            'email' => $email,
        ]);
    }
    
    $stmt->free_result(); // освобождаем память
    $stmt->close();
    $link->close();


    Ссылки: Статья на хабре, Stackoverflow

    P.S. Не вполне понятно, почему написано именно так (через mysqli*, зачем нужен store_result).
    Думаю, что сам код можно упростить если воспользоваться тем же PDO или более высокоуровневым инструментом.
    Ответ написан
    Комментировать
  • Как обрезать картинку в квадрат, именно в квадрат?

    Судя по контексту, вопрос скорее всего не про PHP, а про HTML/CSS.
    Варианта 2:
    1) Изображение вынести в фон родительского div
    2) Использовать относительное позиционирование родительского div и абсолютное позиционирование изображения + немного стилей (overflow:hidden; для div)
    Оба подхода потребуют установки высоты и ширины для div

    https://jsfiddle.net/saybb/37o0c61h/6/
    Ответ написан
    Комментировать