PHP mysqli тип bind_param для текста - PullRequest
6 голосов
/ 18 июня 2011

Для формы обратной связи, которая будет выгружать комментарии пользователей в таблицу MySQL, я не уверен, какой тип bind_param использовать для предоставленного пользователем текста обратной связи (тип поля MySQL = text)

function sql_ins_feedback($dtcode,$custip,$name,$email,$subject,$feedback)
{
    global $mysqli ;
    if($stmt = $mysqli->prepare("INSERT INTO feedback (dtcode,custip,name,email,subject,feedback) VALUES (?,?,?,?,?,?)")) 
    {
        $stmt->bind_param("ssssss", $dtcode,$custip,$name,$email,$subject,$feedback);
        $stmt->execute() ;
        $stmt->close() ; 
    }
}

ИЛИ ЭТО?

        $stmt->bind_param("sssssb", $dtcode,$custip,$name,$email,$subject,$feedback);

Итак, является ли тип BLOB-объекта правильным типом bind_param для текстового поля?

Каков предел размера для типа bind_param ("s")?

Есть ли что-то еще, что нужно сделать при использовании bind_param ("b")? Руководство (и кое-что еще, что я читаю где-то / когда-то) предлагает, чтобы типы BLOB-объектов обрабатывались по-разному - что я должен знать?

Спасибо

Ответы [ 2 ]

9 голосов
/ 18 июня 2011

Это на самом деле зависит от сервера Mysql.Максимальный размер по умолчанию для всех данных, объединенных во весь запрос, составляет 1 МБ.См .: http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

Если ваши объединенные данные находятся под этим порогом "max_allowed_packet" , просто используйте "s" для типа привязки для любого текстового поля.Infact, вы обычно можете избежать использования «s» для любого типа поля вообще (дата, число с плавающей точкой и т. Д.).

Если ваша совокупная запись, которую вы хотите вставить, превышает 1 МБ (или что-то, что вы сбросилив длину), вы захотите использовать метод mysqli_stmt :: send_long_data и тип привязки "b" для отправки этого конкретного поля кусками.

0 голосов
/ 04 мая 2013

Для тех, кто хочет использовать mysqli bind_param('ssbss', $data), вы должны использовать bind_param('sssss'), пока вы делаете UPDATE или INSERT. Таким образом, вы можете динамически заменить все? в подготовленном запросе со значениями, хранящимися в массиве:

call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($typeValues));

$typeValues - это массив, объединенный с использованием array_merge или array_unshift по массиву ('sssss') и массиву (ссылка на var1, ссылка на var2, ...);

makeValuesReferenced:

/**
 * All prepared variables' references are needed by function bind_param
 * @param &$arr: array constituted of types and values
 */
function makeValuesReferenced(&$arr){
    $refs = array();
    foreach($arr as $key => $value) {
        // Param 1 of bind_param only needs value of types array
        if($key === 0) {
          $refs[$key] = $arr[$key];
        } else {
          $refs[$key] = &$arr[$key];            
        }
    }
    return $refs;
}

Используя bind_param ('ssbss', $ data), вы получите только пустую ячейку в столбце BLOB-объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...