Member 13761429 Ответов: 2

Проблема аргумента по каждому элементу


read.php

<?php
require_once('../dao/config.php');
require_once('../dao/crudDAO.php');

$list = crudDAO::read();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CRUD



	<div>
    	<div>
        	
            	                	<?php foreach($list as $key => $value) { ?>
                    
                                        <?php } ?>
            <table><tbody><tr>                	<td>id</td>                    <td>Name</td>                    <td>Email</td>                    <td>Address</td>                    <td>Mobile number</td>                </tr><tr><td><?= $value['id'] ?></td>                    <td><?= $value['name'] ?></td>                    <td><?= $value['email'] ?></td>                    <td><?= $value['address'] ?></td>                    <td><?= $value['mob'] ?></td>                </tr></tbody></table>
        </div>
    </div>



ошибка:
Предупреждение: недопустимый аргумент, предоставленный для foreach() в C:\xampp\htdocs\crud_php\oop_crud\pages\read.php на линии 25
id имя адрес электронной почты номер мобильного телефона



crudDAO.php

<?php
class CrudDAO {
	public function create($name, $email, $address, $mob) {
		global $db;
		$sql = "INSERT INTO users SET name = '$name', email = '$email', address = '$address', mob = '$mob'";
		$result = $db->query($sql);
		
		if($result) {
			return $result;
		} else {
			return false;
		}
	}
	
	public function read() {
		global $db;
		$sql = "SELECT * FROM users ORDER BY id";
		$result = $db->query($sql);
		
		if($result->num_rows > 0) {
			$i = 0;
			$list = " ";
			while($row = $result->fetch_assoc()) {
				$list[$i] = $row;
				$i++;
			}
			return $list;
		} else {
			return false;
		}
	}
	
	public function update() {
		global $db;
	}
	
	public function delete() {
		global $db;
	}
}
?>


ошибка:
Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Что я уже пробовал:

Найти решение в интернете

Предупреждение: недопустимый аргумент, предоставленный для foreach() в C:\xampp\htdocs\crud_php\oop_crud\pages\read.php на линии 25
id имя адрес электронной почты номер мобильного телефона



Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

Обратите внимание: преобразование массива в строку в C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php на линии 24

2 Ответов

Рейтинг:
7

Jochen Arndt

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\crud_php\oop_crud\pages\read.php on line 25
выдается за
<?php foreach($list as $key => $value) { ?>
То $list аргумент недействителен. PHP: foreach - руководство пользователя[^] ожидает выражение массива.

Он назначен здесь
$list = crudDAO::read();

Поэтому следующим шагом будет проверка этой функции.
if($result->num_rows > 0) {
    $i = 0;
    $list = " ";
    while($row = $result->fetch_assoc()) {
        $list[$i] = $row;
        $i++;
    }
    return $list;
} else {
    return false;
У него есть два пути возврата. Если не совпадающие наборы записей можно найти логическое значение false возвращенный. Таким образом, вы должны проверить это возвращаемое значение при вызове функции или вернуть пустой массив вместо логического значения.

Есть и другие предупреждения
Notice: Array to string conversion in C:\xampp\htdocs\crud_php\oop_crud\dao\crudDAO.php on line 24
Они сообщают вам, что $list это массив строк. Но вам нужен массив массива. Решение состоит в том, чтобы объявить $list как массив. Собрав его вместе, вы можете использовать что-то вроде
$list = array();
if($result->num_rows > 0) {
    $i = 0;
    while($row = $result->fetch_assoc()) {
        $list[$i] = $row;
        $i++;
    }
}
return $list;
}


Member 13761429

спасибо....

Jochen Arndt

Добро пожаловать и благодарю вас за то, что вы приняли мое решение.

Рейтинг:
16

Patrice T

Даже без какой-либо ошибки, я боюсь, что это пустой цикл:

<?php foreach($list as $key => $value) { ?>
<?php } ?>


$sql = "INSERT INTO users SET name = '$name', email = '$email', address = '$address', mob = '$mob'";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Member 13761429

пожалуйста, помогите мне решить мою вышеописанную проблему foreach

Patrice T

"foreach($list as $key => $value)"
где вы видели этот синтаксис в руководстве php ?

Jochen Arndt

http://php.net/manual/en/control-structures.foreach.php:
foreach (array_expression as $key => $value)

Patrice T

Хорошо

Member 13761429

тогда как решить эту проблему и защитить мой код от sql инъекции

Member 13761429

спасибо