Цитата:
|
"Разошелся так и сыпеть, будь он параллелепипедь, будь он круг, ядрена вошь."
|
Вы laimas дрыгаетесь как Моська из-за моей лени читать ваши легенды. Но я могу и потрудиться. Например вот тезисы из тележищи сугубо по устройству реляционной базы данных воображаемого обувного магазина.
Цитата:
|
Потому что невежда. Все что вы пытались объяснить нубу, называется - метафора.
Например рабочий стол в Винде - это метафора рабочего стола человека, где лежат документы, банка с авторучками и карандашами, блокнот, счеты, ящики входящие-исходящие и все что обычно может лежать на рабочем столе. Папка в винде - это метафора папки в шкафу. В папке хранятся файлы - это метафора файлов - таких картонных карточек с записями например о персоналиях или товарах, или пациентах и тп. Товар на веб-странице интернет-магазина - метафора настоящего товара. Так вот реляционная БД не имеет метафоры. Это чисто компьютерная сущность, которая силой воображения и труда инженера может быть спроектирована как метафора реальной, привычной сущности, например полок обувного магазина. И вот когда у вас есть такой магазин, или вы хорошо, или вообще знаете как он работает, как обычно такие магазины работают, то не потребуется больших умственных затрат чтобы спроектировать БД под метафору такого магазина. А вот если не знаете - то ничего и не получится. Потому что нет прототипа. Не с чего метафорировать так сказать. Достаточно разок увидеть счет-фактуру того самого магазина чтобы понять как оно в общем и целом устроено. Возникает вопрос - откуда у ТС вообще идея тренироваться на продаже обуви, если он не бельмеса в этом деле? |
Цитата:
|
С таким кодом:
function get_product($id) { global $link; $query = ("select products.*,sizes.size from products left joint sizes on sizes.id = products.size_id "); $result = mysqli_query($link, $query); if ($result) { $row = mysqli_fetch_array($result); return $row; } } выходит эта ошибка: Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'Erreur de syntaxe prГЁs de 'joint sizes on sizes.id = products.size_id' Г la ligne 3' in C:\wamp\www\Shop\db_fns.php on line 143 И как выводить нужные размеры в списке через products.size_id? Ведь у каждого ботинка может быть определённые размеры, а в этой колонке можно поставить только одну цифру... |
Цитата:
Цитата:
|
Так у меня выводится карточка товара с описанием:
<table align="center" style="border-width: 1; border-style: dashed" class="product" width="200" height="200"> <tr> <td valign="top" align="center" cellpadding="5" cellspacing="5"> <div><a href="#"><img src="userfiles/<?=$product['image']?>" width="150" height="100" alt="" /></a></div> <div class="description"> <div class="product-name"><a href="#"><?=$product['title']?></a></div> <div class="product-price">Цена: <?=$product['price']?> руб</div> </div> </td> <td valign="top"> <div><?=$product['description']?></a></div> <form action="index.php" method="get"> <fieldset> Размер: <input type="hidden" name="view" value="add_to_cart"> <input type="hidden" name="id" value="<?=$product['id']?>"> <select name="size"> <?php $result = $link->query("SELECT size FROM sizes WHERE `sizes`.`id_boot`='$id' "); while ($b = mysqli_fetch_assoc($result)) { echo "<option value='".$b['size']."'>" .$b['size']. " </option>"; } ?> </select></fieldset> <input type=image src="userfiles/8.jpg" width="60" height="60" value="Добавить в корзину"> </form> </td> </tr> </table> Такой кейс: case ('product'): $id = $_GET['id']; $product = get_product($id); break; И функция выборки товара: function get_product($id) { global $link; $query = ("SELECT * FROM products WHERE id='$id' "); $result = mysqli_query($link, $query); if ($result) { $row = mysqli_fetch_array($result); return $row; } } Если в этой функции делаю тот код с left join, то и появляются та ошибка, которую привёл. А по поводу БД и таблиц. У меня есть таблица products с описанием товаров, и есть таблица sizes, где через size_id идёт ассоциация с id продукта. В ней получается: id size_id size 1 1 19 2 1 20 3 1 21 4 2 19 5 2 20 6 2 21 7 2 22, где size_id это id ботинка. И в карточке товара выпадающим списком выводится у ботинка id=1 размеры 19-20, у ботинка id=2 размеры 19-22. Я додумался только до такого вывода размеров...... |
У вас что "французский" SQL? :)
Ошибка потому, что объединение запроса не потому полю. ID размера это уникальный для размера ключ. Таблица продуктов не может содержать в себе ссылки на таблицу размеров, таким образом указывая как размеры есть у продукта. В противном случае придется дублировать каждую запись о продукте в этой таблице, а сделать этого нельзя, так как ID продукта тоже уникальное значение. Чтобы связать продукты с размерами, которые у них есть, нужна внешняя таблица связей между этими таблицами. Пусть таблица продуктов, условно products pid name etc 1 name 1 aaaaaa 2 name 2 bbbbbb Таблица размеров, условно proportions id size 1 19 2 20 3 21 4 22 А вот так они связываются через внешнюю таблицу, условно назовем ее relations: pid id 1 1 1 2 1 4 2 1 2 3 И у этой таблицы pid + id, это составной уникальный ключ, который не позволит одному и тому же продукту указать два и более раза один и тот же размер. Из этой таблицы видно, что продукт 1 имеет размеры 19, 20 и 22, а продукт 2 размеры 19 и 21. Если ведется учет количества размеров на складе, то эта таблица может содержать и поле описывающее это количество для каждого из размеров у каждого из продуктов. Чтобы получить товары и их размеры, запрос к таблице продуктов обращается к этой таблице соединяя их как ON relations.pid = products.pid А по полученному таким образом id размера из этой таблицы, объединяем в запрос и таблицу размеров как ON relations.id = proportions.pid Получаем такой запрос: $q = mysql_query('SELECT * FROM products LEFT JOIN relations USING(pid) LEFT JOIN proportions USING(id) ORDER BY name, size'); Так как имена полей в таблицах по которым они связываются одни и те же что в родительских, что в таблице связей, то используется USING(). Результатом будет ресурс: Array ( [0] => Array ( [id] => 1 [pid] => 1 [name] => name 1 [etc] => aaaaaa [size] => 19 ) [1] => Array ( [id] => 2 [pid] => 1 [name] => name 1 [etc] => aaaaaa [size] => 20 ) [2] => Array ( [id] => 4 [pid] => 1 [name] => name 1 [etc] => aaaaaa [size] => 22 ) [3] => Array ( [id] => 1 [pid] => 2 [name] => name 2 [etc] => bbbbbb [size] => 19 ) [4] => Array ( [id] => 3 [pid] => 2 [name] => name 2 [etc] => bbbbbb [size] => 21 ) ) в котором проходом в цикле по ключу pid получаем описание товара и список его размеров. Вы в своем запросе пытаетесь связать таблицы как ID товара равно ID размера, что даже по логике несуразица, и об остальном можно и не говорить уже. |
Благодарю, переделал в БД таблицы, только вместо таблицы proportions оставил sizes. И списком размеры не выдаёт, пишет ошибки:
Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'Champ: 'id' dans from clause est ambigu' in C:\wamp\www\Shop\views\pages\product.php on line 39 ( ! ) mysqli_sql_exception: Champ: 'id' dans from clause est ambigu in C:\wamp\www\Shop\views\pages\product.php on line 39 Line 39 это - ORDER BY title, size <select name="size"> <?php $result = $link->query('SELECT * FROM products LEFT JOIN relations USING(pid) LEFT JOIN sizes USING(id) ORDER BY title, size'); while ($b = mysqli_fetch_assoc($result)) { echo "<option value='".$b['size']."'>" .$b['size']. " </option>"; } ?> </select> sizes вместо proportions title вместо name Да, по кодировке: пытаюсь выставить utf8_general_ci, но автоматически всё равно выставляется utf8mb4_general_ci..... Глюк какой-то...... |
Часовой пояс GMT +3, время: 12:42. |