Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 7
1

Ошибка с выводом данных из нескольких таблиц SQL

26.08.2016, 21:35. Показов 1404. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день/вечер, нуждаюсь в помощи знающих людей.
Ошибка состоит в ошибке "Warning: Invalid argument supplied for foreach() in /home/bd2sem.fl8.ru/public_html/books.php on line 106"
Сам код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<html>
  <head>
  <link rel="stylesheet" type="text/css" href="style.css" >
  </head>
 
<?php
 
$pdo = new PDO('mysql:host=127.0.0.1;dbname=123', '123', '123');
$pdo ->exec('set names "utf8";');
 
switch (@$_GET['action'])
{
  case 'add':
    $publishing = $pdo->query('SELECT * FROM `publishing`');
    $authors = $pdo->query('SELECT * FROM `authors`');
    $genres = $pdo->query('SELECT * FROM `genres`');
 
    $url = '/books.php?action=create';
    include 'forms/book.php';
  break;
 
  case 'create':
    $sql = $pdo->prepare('INSERT INTO `books` ( `name`, `publish_id`, `author_id`, `genre_id`, `date`) VALUES (:name, :publish_id, :author_id, :genre_id, :date)');
    $sql->execute([
      
      ':name' => $_POST['name'],
      ':publish_id' => (int)$_POST['publish_id'],
      ':author_id' => (int)$_POST['author_id'],
      ':genre_id' => (int)$_POST['genre_id'],
      ':date' => $_POST['date']
    ]);
    echo 'Успешно добавлено!<br><a href="/books.php" class="s1">Список книг</a>';
  break;
  
  case 'edit':
    $sql = $pdo->prepare('SELECT * FROM `books` WHERE `id` = :id');
    $sql->execute([':id' => $_GET['id']]);
    $publish = $sql->fetch();
 
    $publishing = $pdo->query('SELECT * FROM `publishing`');
    $authors = $pdo->query('SELECT * FROM `authors`');
    $genres = $pdo->query('SELECT * FROM `genres`');
 
    $url = '/books.php?action=update&id=' . $_GET['id'];
    include 'forms/book.php';
  break;
  
  case 'update':
    $sql = $pdo->prepare('UPDATE `books` SET `name` = :name, `city` = :city, `country` = :country WHERE `id` = :id LIMIT 1');
    $sql->execute([
      ':id' => $_GET['id'],
      
      ':name' => $_POST['name'],
      ':publish_id' => (int)$_POST['publish_id'],
      ':author_id' => (int)$_POST['author_id'],
      ':genre_id' => (int)$_POST['genre_id'],
      ':date' => $_POST['date']
    ]);
    echo 'обновлена!<br><a href="/books.php" class="s1">Список книг</a>';
  break;
 
  case 'delete':
    $sql = $pdo->prepare('DELETE FROM `books` WHERE `id` = :id LIMIT 1');
    $sql->execute([':id' => $_GET['id']]);
    echo 'Удалено!<br><a href="/books.php" class="s1">Список книг</a>';
  break;
 
  default:
  
    echo '<a href="/books.php?action=add" class="s1">Добавить книгу</a><br>';
 
    $books = $pdo->query(
      'SELECT 
        `b`.`id`, 
        `b`.`date`, 
        `b`.`name`, 
       (" ", `a`.`name`, `a`.`lastname`, `a`.`otche`) `author_name`, 
        `g`.`name` `genre_name`,
        `p`.`name` `publish_name` 
       FROM 
        `books` `b`, 
        `authors` `a`, 
        `publishing` `p`,
          `genre` `g` 
       WHERE 
        `b`.`author_id` = `a`.`id` 
       AND
        `b`.`genre_id` = `g`.`id`
         AND
          `b`.`publish_id` = `p`.`id`
       ');
 
 
    echo '<table border="1" cellspacing="0">';
 
    echo '<tr>';
    echo '<th>ID</th>';
    echo '<th>Название</th>';
    echo '<th>Автор</th>';
    echo '<th>Жанр</th>';
    echo '<th>Публикация</th>';
    echo '<th>Дата</th>';
    echo '<th>&nbsp;</th>';
    echo '</tr>';
 
    foreach ($books as $book)
    {
      echo '<tr>';
      echo 
        '<td>' . $book['id'] . '</td> ' 
      . '<td>' . $book['name'] . '</td> '
      . '<td>' . $book['author_name'] . '</td> ' 
      . '<td>' . $book['genre_name'] . '</td> ' 
      . '<td>' . $book['publish_name'] . '</td> '
      . '<td>' . $book['date'] . '</td> '
      . '<td><a href="/books.php?action=edit&id=' . $book['id'] . '" class="s2">ред.</a> <a href="/publishing.php?action=delete&id=' . $book['id'] . '" class="s2">уд.</a></td>';
      echo '</tr>';
 
    }
    echo '</table>';
 
  break;
}
При создании книги все данные спокойно отправляются в БД, но вот затем не выводит при запросе.
Предполагаю, что ошибка таится здесь:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$books = $pdo->query(
      'SELECT 
        `b`.`id`, 
        `b`.`date`, 
        `b`.`name`, 
       (" ", `a`.`name`, `a`.`lastname`, `a`.`otche`) `author_name`, 
        `g`.`name` `genre_name`,
        `p`.`name` `publish_name` 
       FROM 
        `books` `b`, 
        `authors` `a`, 
        `publishing` `p`,
          `genre` `g` 
       WHERE 
        `b`.`author_id` = `a`.`id` 
       AND
        `b`.`genre_id` = `g`.`id`
         AND
          `b`.`publish_id` = `p`.`id`
       ');
Надеюсь на помощь :>
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2016, 21:35
Ответы с готовыми решениями:

QuickRep с выводом нескольких таблиц через SQL запрос
Нужна помощь с отчетом в QuickRep с выводом с помощью нескольких таблиц. Есть две таблицы -...

Выборка данных SQL Select из нескольких таблиц
loans - таблица кредитных договоров debtors - таблица заемщиков Задача сделать выборку телефонов...

Выборка данных SQL Select из нескольких таблиц
loans - таблица кредитных договоров debtors - таблица заемщиков Задача сделать выборку телефонов...

Вывод данных из нескольких таблиц - SQL, (PHP)
Помогите, пожалуйста:scratch: Выдает ошибку: Column 'title' in field list is ambiguous ...

7
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
26.08.2016, 21:50 2
Deamon09, PDO::query возвращает PDOStatement или FALSE, если запрос выполнить не удалось.
замените
PHP
1
foreach ($books as $book)
на
PHP
1
2
if ($books === false) die(print_r($pdo->errorInfo, true));
while($book = $books->fetch(PDO::FETCH_ASSOC))
Добавлено через 6 минут
А лучше установить режим реакции на ошибки в PDO::ERRMODE_EXCEPTION
PHP
1
2
3
4
5
$opt = [
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            ];
            $link = new \PDO($cfg->getDSN(), $cfg->getUser(), $cfg->getPassword(), $opt);
и оборачивать в try/catch
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 7
27.08.2016, 11:25  [ТС] 3
Заменил так как Вы сказали, ошибка осталась.
Перепроверил все названия таблиц, всё записано верно.
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
27.08.2016, 11:49 4
Deamon09, попробуйте так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$books = $pdo->query(
      'SELECT 
        `b`.`id`, 
        `b`.`date`, 
        `b`.`name`, 
       concat_ws(" ", `a`.`name`, `a`.`lastname`, `a`.`otche`) as `author_name`, 
        `g`.`name` as `genre_name`,
        `p`.`name` as `publish_name` 
       FROM 
        `books` as `b`, 
        `authors` as `a`, 
        `publishing` as `p`,
          `genre` as `g` 
       WHERE 
        `b`.`author_id` = `a`.`id` 
       AND
        `b`.`genre_id` = `g`.`id`
         AND
          `b`.`publish_id` = `p`.`id`
       ');
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 7
27.08.2016, 12:04  [ТС] 5
Опять "Invalid argument supplied for foreach()"

Добавлено через 2 минуты
Просто я без проблем беру данные из одной таблицы БД, а вот с 2х и более не получается.
Тут, к примеру, все отлично работает.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<html>
  <head>
 <link rel="stylesheet" type="text/css" href="style.css" >
  </head>
<?php
 
$pdo = new PDO('mysql:host=127.0.0.1;dbname=123', '123', '123');
$pdo ->exec('set names "utf8";');
 
 
switch (@$_GET['action'])
{
  case 'add':
        $url = '/authors.php?action=create';
    include 'forms/author.php';
  break;
 
  case 'create':
    $sql = $pdo->prepare('INSERT INTO `authors` ( `name`, `lastname`, `otche`) VALUES (:name, :lastname, :otche)');
    $sql->execute([
      
      ':name' => $_POST['name'],
      ':lastname' => $_POST['lastname'],
      ':otche' => $_POST['otche']
    ]);
    echo 'Успешно добавлено!<br><a href="/authors.php" class="s1">Список авторов</a>';
  break;
  
  case 'edit':
    $sql = $pdo->prepare('SELECT * FROM `authors` WHERE `id` = :id');
    $sql->execute([':id' => $_GET['id']]);
    $author = $sql->fetch();
 
 
    $url = '/authors.php?action=update&id=' . $_GET['id'];
    include 'forms/author.php';
  break;
  
  case 'update':
    $sql = $pdo->prepare('UPDATE `authors` SET `name` = :name, `lastname` = :lastname, `otche` = :otche WHERE `id` = :id LIMIT 1');
    $sql->execute([
      ':id' => $_GET['id'],
      ':name' => (int)$_POST['name'],
      ':lastname' => $_POST['lastname'],
      ':otche' => $_POST['otche']
    ]);
    echo 'обновлена!<br><a href="/authors.php" class="s1">Список авторов</a>';
  break;
 
  case 'delete':
    $sql = $pdo->prepare('DELETE FROM `authors` WHERE `id` = :id LIMIT 1');
    $sql->execute([':id' => $_GET['id']]);
    echo 'Удалено!<br><a href="/authors.php" class="s1">Список авторов</a>';
  break;
 
  default:
 
    echo '<a href="/authors.php?action=add" class="s1">Добавить автора</a><br>';
 
    $authors = $pdo->query('SELECT * FROM `authors`'); 
    echo '<table border="1" cellspacing="0">';
 
    echo '<tr>';
    echo '<th>ID</th>';
    echo '<th>Name</th>';
    echo '<th>Lastname</th>';
    echo '<th>Otchestvo</th>';
    echo '<th>&nbsp;</th>';
    echo '</tr>';
 
    foreach ($authors as $author)
    {
      echo '<tr>';
      echo 
        '<td>' . $author['id'] . '</td> ' 
      . '<td>' . $author['name'] . '</td> '
      . '<td>' . $author['lastname'] . '</td> ' 
      . '<td>' . $author['otche'] . '</td> ' 
      . '<td><a href="/authors.php?action=edit&id=' . $author['id'] . '" class="s2">ред.</a> <a href="/authors.php?action=delete&id=' . $author['id'] . '" class="s2">уд.</a></td>';
      echo '</tr>';
 
    }
    echo '</table>';
 
  break;
}
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
27.08.2016, 13:36 6
Лучший ответ Сообщение было отмечено Deamon09 как решение

Решение

Deamon09, Попробуйте выполнить проблемный запрос в phpMyAdmin

Добавлено через 56 минут
Deamon09, вот рабочий вариант
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$books = $pdo->query(
'SELECT
  `b`.`id`   AS `id`,
  `b`.`date` AS `date`,
  `b`.`name` AS `name`,
  concat_ws(
      \' \', `a`.`name`, `a`.`lastname`, `a`.`otche`
  )          AS `author_name`,
  `g`.`name` AS `genre_name`,
  `p`.`name` AS `publish_name`
FROM `books` `b`
  JOIN `authors` `a`
  JOIN `publishing` `p`
  JOIN `genre` `g`
WHERE (
  (`a`.`id` = `b`.`author_id`) AND
  (`g`.`id` = `b`.`genre_id`) AND
  (`p`.`id` = `b`.`publish_id`)
)');
 
if($books) {
    foreach ($books as $book) {
        var_dump($book);
    }
} else {
    die(print_r($pdo->errorInfo(), true));
}
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 7
27.08.2016, 13:56  [ТС] 7
Спасибо за помощь, всё работает.
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 7
27.08.2016, 14:09  [ТС] 8
Решил добавить новые данные и они не отображаются, так же не получается редактировать или же удалить.
Вот форма для добавления книг:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<form action="<?= $url ?>" method="post">
 
  <label>Название</label><br>
  <input type="text" name="name" value="<?= @$book['name'] ?>"><br>
  
  <label>Автор</label><br>
  <select name="author_id">
    <?php
    foreach ($authors as $author)
    {
      echo '<option value="' . $author['id'] . '"' . ((int)$book['author_id'] === (int)$author['id'] ? ' selected' : '') . '>';
      echo $author['name'] . ' ' . $author['lastname'] . ' ' . $author['otche'];
      echo '</option>';
      echo "\n";
    }
    ?>
  </select><br>
 
  <label>Публикация</label><br>
  <select name="publish_id">
    <?php
    foreach ($publishing as $publish)
    {
      echo '<option value="' . $publish['id'] . '"' . ((int)$book['publish_id'] === (int)$publish['id'] ? ' selected' : '') . '>';
      echo $publish['name'];
      echo '</option>';
      echo "\n";
    }
    ?>
  </select><br>
  
  <label>Жанр</label><br>
  <select name="genre_id">
    <?php
    foreach ($genres as $genre)
    {
      echo '<option value="' . $genre['id'] . '"' . ((int)$book['genre_id'] === (int)$genre['id'] ? ' selected' : '') . '>';
      echo $genre['name'];
      echo '</option>';
      echo "\n";
    }
    ?>
  </select><br>
  
  
 
  <label>Дата</label><br>
  <input type="date" name="date" value="<?= $book['date'] ?: date('Y-m-d') ?>"><br>
 
  
  
  <br>
  <button type="submit">Сохранить</button>
</form>
Миниатюры
Ошибка с выводом данных из нескольких таблиц SQL  
0
27.08.2016, 14:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2016, 14:09
Помогаю со студенческими работами здесь

SQL редактирование данных из нескольких таблиц на форме
Как отобразить данные в textBox'ах из таблиц, связанных по первичному ключу с таблицей,...

Отображение нескольких таблиц из базы данных SQL в DataGridView
Как создать отображение нескольких таблиц из базы данных SQL в DataGridView?

SQL запрос в VBA на выборку данных из нескольких таблиц mdb
Добрый день. Есть база mdb с несколькими таблицами: Регистр - общая таблица с хранением...

Объединение нескольких таблиц перед выводом в DataGridView
Столкнулся с такой проблемой. Вывожу из xml файла таблицы. Хочу вывести несколько таблиц, которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru