Я использую это для ввода данных пользователя и очистки кода. Я попытался исправить это, и тогда код перестает работать.
Это работает:
$BindVar[] = array(); $BindVar[] = $Email; $BindVar[] = $pass;
Однако это не так:
$BindVar[] = array($Email,$pass);
Вот код, который ломается, когда я меняю эту строку:
foreach ($BindVars as $value) { $input[] = "'" . $mysqli->real_escape_string($value) . "'"; // cleaning the input }
Он дает эту ошибку:
Предупреждение: mysqli :: real_escape_string () ожидает, что параметр 1 будет строкой, массив указан в
Чтобы понять ваше сообщение об ошибке, я думаю, ему нужно некоторое объяснение в отношении массивов.
Если вы используете скобки типа $bindVars[]
, вам не нужно говорить, что это массив, вызывая функцию array()
.
PHP понимает скобки []
как объявление массива.
Ваши объявления с помощью скобок []
и функция array()
$BindVars[] = array($Email,$pass); // same as: $BindVars = array( array($Email, $pass); );
создает новый массив внутри $bindVars
содержащий элементы $Email
& $pass
.
Таким образом, $bindVars
уже является массивом из-за скобок []
. Это дает нам многомерный массив .
В вашем коде это 2-мерный массив, который представляет собой таблицу . Это наиболее часто используемый многомерный массив.
3-мерный массив, такой как $bindVars[][][]
(3 пары скобок) представляет собой куб или матрицу.
4-Dimenisional Array $bindVars[][][][]
(4 пары скобок) – это куб с другим измерением на каждой его стороне. — С каждым дальнейшим Измерением он становится более ошеломляющим –
Вернемся к 2-мерному массиву :
1. Размер – это строка или запись
2. Размер – это столбец или поле.
// 1. Dimension: 1. row echo $bindVars[0]; // Output: Array() Here is your mysqli error coming from!
Предупреждение: mysqli :: real_escape_string () ожидает, что параметр 1 будет строкой, массив задан …
/* --- 1. Record/Row --- */ // 2. Dimension: 1. row, 1. column echo $bindVars[0][0]; // Output: value of $Email // 2. Dimension: 1. row, 2. column echo $bindVars[0][1]; // Output: value of $pass /* --- 2. Record/Row --- */ // 1. column echo $bindVars[1][0]; // Output: value of $Email // 2. column echo $bindVars[1][1]; // Output: value of $pass // And so on
+ Изменить
$BindVar[] = array($Email,$pass);
в
$BindVar = array($Email,$pass);
$BindVar[] = $Email; $BindVar[] = $pass;
Это массив с 2 строковыми элементами.
$BindVar[] = array($Email,$pass);
Это массив с 1 элементом массива, содержащим 2 строковых элемента
Оба они разные, и их следует рассматривать по-разному. Первый – это простой массив, а второй – многомерный массив.
И о, я забыл о твоих
$BindVar[] = array();
Это приведет к неожиданному поведению. Это фактически добавляет пустой массив в ваш массив $BindVar
. По внешнему виду, я думаю, вы просто хотите объявить, что $ BindVar как массив, сделайте это
$BindVar = array();
[]
предназначены для добавления нового элемента в массив. $BindVar[] = array(...)
помещает другой массив в этот элемент первого массива. Вот почему выполнение real_escape_string
в этом элементе не выполняется, потому что этот элемент не является строкой, а вложенным массивом.
Псевдоопределение того, как ваш код структурирует массив:
Первый:
$BindVar[] = array(); $BindVar[] = $Email; $BindVar[] = $pass; $BindVar ( Array(), Email, Pass )
Во-вторых:
$BindVar[] = array($Email,$pass); $BindVar ( Array(Email, Pass) )
Эти два явно отличаются друг от друга.
$BindVar[] = array(); ^^^^^^^^^^---- push a new array into $BindVar
Если $bindvar
был определен до этого, вы будете создавать новый массив и затем вставлять в него пустой массив. Это $BindVar[0]
что $BindVar[0]
является массивом, и когда вы перебираете его для операции привязки, вы будете передавать этот новый пустой массив на вызов bind. следовательно, ваша ошибка.
Вы, вероятно, хотите просто:
$BindVar = array(); ^--- no []
$BindVar[] = array($Email,$pass);
до $BindVar = array($Email,$pass);