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

  • Автор темы dok123
  • 34
  • Обновлено
  • 16, May 2024
  • #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:

dok123


Рег
07 Nov, 2012

Тем
1

Постов
1

Баллов
11
  • 20, May 2024
  • #2
что-то подобное будет более безопасным, простым в обслуживании и менее подверженным 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`";

// don't use @ for error suppression.

$result = mysqli_query($dbcnx, $sql);

}
PHP:
 

Maksim3


Рег
17 Nov, 2013

Тем
1

Постов
3

Баллов
13
  • 31, May 2024
  • #3
Измените эту строку:

if(isset($_POST['c']) & & $_POST['c']=="") {$c = array(); }

Сделай это:

$sql_c="";

если ( isset($_POST['c'])) ){

//ваша остальная часть кода

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

Ошибка возникает, потому что вы добавляете переменную, которая ранее не была определена.

«.=" — это способ добавления двух строк в PHP.
 

mironovtlt


Рег
23 Jul, 2013

Тем
1

Постов
3

Баллов
13
  • 03, Jun 2024
  • #4
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'], [

// approval list

'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

');

// process $result here

}

}
Код (разметка): составив список одобренных значений, вы можете отклонить попытки взлома (люди, выставляющие значения $_POST), и вам даже не придется ничего дезинфицировать.

Поскольку эти три поля всегда присутствуют, у них нет причин находиться на стороне клиента вашей формы. НИКОГДА слепо не доверяйте содержимому массива запросов.

По возможности проверяйте их по списку допустимых значений.
 

gerrok


Рег
27 Nov, 2014

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно