Как определить тип данных входных значений, получаемых из моей HTML-формы, чтобы я мог использовать их для привязки параметров в подготовленном выражении - PullRequest
1 голос
/ 08 ноября 2019

Я хочу динамически определить тип данных входных значений, которые я получаю из моей HTML-формы ввода. Это поможет мне связать значения параметров данных, которые я вставляю в свою базу данных, используя PHP.

Эта информацияпоможет мне определить значения строки 'sss' в приведенном ниже коде для подготовленного оператора MySQL, я хочу создать класс данных вставки, и входные значения могут иметь тип 'sdib' для типов string, double, integerили Blob.

 if($stmt = $mysqli->prepare($sql)) {
    $stmt->bind_param("sss", $first_name, $last_name, $email);
 }

Я попробовал приведенный ниже код и даже попробовал некоторые другие коды в руководстве по PHP, которые напрасно используют call_user_func_array().

Я понимаю, что входные значения из форм HTML всегда являются строками.

// SECTION USING PREPARED STATEMENT IN INSERT QUERY
if ($stmt = $mysqli->prepare($sql)) {
    $stmt->bind_param("sss", $first_name, $last_name, $email);
}

//CODE SHOWING HOW I AM TRYING TO GET DATA TYPE OF HTML INPUT VALUES
if (gettype($v) === "string") {
    return "s";
} elseif (gettype($v) === "float") {
    return "d";
} elseif (gettype($v) === "integer") {
    return "i";
} elseif (gettype($v) === "binary") {
    return "b";
} else {
    $e = '..could not establish data type';
    $this->setError($e);
    echo $e;
}

Я хочу, чтобы часть типа sss 'DSS' ДИНАМИЧЕСКИ получалась из форм ввода HTML. утверждение, которое я хочу построить, похоже на это

$stmt->bind_param("sddsii", $first_name, $last_name, $email);

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Я хочу динамически определить тип данных входных значений, которые я получаю из моего HTML

"T" в HTML означает "текст". В HTML есть только один тип данных, строка. Любой код, который получает входные данные, исходящие из HTML, должен уже знать, какой тип данных ожидать, и преобразовать строковый ввод в этот тип.

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

1 голос
/ 08 ноября 2019

Как указано в другом ответе, все ваши значения, полученные из HTML, являются строками. Тем не менее, вы можете получать информацию из других источников, которую вы хотели бы передать в свое заявление. Что произойдет, если вы все время будете использовать привязку строк?

Лучший способ - проверить это.

$data1 = '1';
$data2 = 2;
$data3 = '0.5-a';
$stmt = $mysqli->prepare('SELECT ?=1 AS f1, ?="2" AS f2, ?=0.5 AS f3');
$stmt->bind_param('sss', $data1, $data2, $data3); // binding string
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
var_dump($row); // all true

В этих простых примерах нет разницы. Почему? Потому что MySQL приведёт строку к соответствующему типу, если она используется в числовом контексте.

Зачем указывать тип явно, если почти все может быть отправлено в виде строки?
Поскольку, если вы знаете тип данных ваших значений, вам не следует возвращать их ивперед. Если у вас есть целые числа и вы используете их в MySQL в числовом контексте, то нет смысла приводить их к строке в MySQLi bind_param().

Еще один важный случай использования - это когда MySQL действительно делает различие в типах. Например, в пункте ORDER BY. Если вы связываете строку вместо числа, порядок будет другим. MySQL может принимать либо порядковый номер, представляющий номер столбца в SELECT, либо имя столбца (которое не может быть связано), либо строковый литерал.

$data1 = '2';
// I want the records to be ordered by `name`, which is the second column
$stmt = $mysqli->prepare('SELECT id, name FROM products ORDER BY ?');
$stmt->bind_param('i', $data1); // binding integer instead of string

Связанный пост: mysqli_stmt :: bind_param () - укажите другой тип данных, кроме «s» для каждого параметра

Когда дело доходит до двоичного или большого двоичного объекта,они просто двоичные строки. Это означает, что у них нет набора символов, а сортировка и сравнение основаны на числовых значениях байтов в значениях столбцов.
Если вам когда-нибудь понадобится вставить значение большого двоичного объекта, оно, скорее всего, не придет из формы HTML какСтрока, а скорее из чтения в файле, и вы будете знать, что вам нужно использовать b.

...