Неопределенная ошибка переменной в массиве

dok123

Пользователь
Регистрация
07.11.12
Сообщения
1
Реакции
0
Баллы
1
У меня есть коллекция флажков с именем c[], но с разными значениями. В php8 приведенный ниже код работает, но выдает предупреждение «Неопределенная переменная $sql_c» (возможно, эта ошибка была просто подавлена в более ранних версиях?). Мне дали код несколько лет назад, и теперь я обновил его многочисленными функциями if isset(), но если я сделаю это с функцией $sql_c, я не получу никаких результатов. Любая помощь будет оценена по достоинству.

Код:
if (isset($_POST['submit']) && isset($_POST['c'])) {
$sql="stuno,fname,lname";
if(isset($_POST['c']) && $_POST['c']=="") {$c = array(); }
foreach ($_POST['c'] as $cID) {
$sql_c .= ",".$cID; << "Undefined variable $sql_c" warning
if (isset($numCat)) {$numCat = $numCat + 1;}
}
$sql = $sql . $sql_c;
$sql="SELECT"." ".$sql." "."FROM records ORDER BY fname";
$result=@mysqli_query($dbcnx, $sql);
PHP:
Неопределенная ошибка переменной в массиве
 

Maksim3

Пользователь
Регистрация
17.11.13
Сообщения
3
Реакции
0
Баллы
1
что-то подобное будет более безопасным, простым в обслуживании и менее подверженным SQL-инъекциям.

Код:
<?php
$submit = filter_input(INPUT_POST, 'submit');
$c = filter_input(INPUT_POST, 'c');
if ($submit && $c) { $columns =['stuno','fname','lname']; if ($c){ foreach ($c as $cID) { $columns[] = $cID; if (isset($numCat)) {$numCat = $numCat + 1;} } } $sql="SELECT ".implode(',',$columns) . " FROM `records` ORDER BY `fname`"; $result = mysqli_query($dbcnx, $sql);
}
PHP:
 

mironovtlt

Пользователь
Регистрация
23.07.13
Сообщения
3
Реакции
0
Баллы
1
Измените эту строку:
if(isset($_POST['c']) && $_POST['c']=="") {$c = array(); }

Сделай это:

$sql_c="";
если ( isset($_POST['c'])) ){

}//проверка заканчивается

Ошибка возникает, потому что вы добавляете переменную, которая ранее не была определена.
«.=" — это способ добавления двух строк в PHP.
 

gerrok

Пользователь
Регистрация
27.11.14
Сообщения
3
Реакции
0
Баллы
1
1) НЕ подавляйте ошибки знаком @. ВСЕГДА!

2) filter_input не работает с массивами.

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

4) не уверен, зачем вам проверять кнопку отправки.

Код:
<?php
if (
!array_key_exists('c', $_POST) ||
!is_array($_POST['c'])
) echo 'Form Submit Failed, invalid or missing values'
else {
if (array_diff( $_POST['c'], [
'sanfu', 'fubar', 'tarfu', 'bohica'
])) echo '
<p>
Possible hacking attempt detected, fields posted to not match those approved for access.
<p>';
else {
if (isset($numCat)) $numCat += count($_POST['c']);
$result = $dbcnx->query('
SELECT stuno, fname, lname, ' . implode(', ', $_POST['c']) . '
FROM records
ORDER BY fname
');
}
}
Код (разметка): составив список одобренных значений, вы можете отклонить попытки взлома (люди, выставляющие значения $_POST), и вам даже не придется ничего дезинфицировать. Поскольку эти три поля всегда присутствуют, у них нет причин находиться на стороне клиента вашей формы.

НИКОГДА слепо не доверяйте содержимому массива запросов. По возможности проверяйте их по списку допустимых значений.
 
Сверху Снизу