#php #mysql
#php #mysql
Вопрос:
Я пытаюсь добавить данные в таблицу 3 с помощью PHP, atm я могу просматривать результаты только по таблицам, которые объединены.
ЗАПРОС РЕЗУЛЬТАТОВ
$sql = mysql_query("SELECT PART_ID, PART_DESC, SERIAL_NUM, PART.RACK_NUM, PART.PART_TYPE_ID, PART_TYPE_DESC, LOCATION
FROM PART
INNER JOIN PART_TYPE ON PART.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID
INNER JOIN RACK ON RACK.RACK_NUM = PART.RACK_NUM
При этом будут получены все строки из таблицы PART, и для каждой из найденных строк сопоставьте эту строку со строкой в таблице PART_TYPE (при условии, что они имеют одинаковый PART_TYPE_ID). Если для данной строки в таблице PART не удается найти совпадения между таблицами PART и PART_TYPE, эта строка не будет включена в результат.
Мой запрос на вставку — вот где у меня возникли проблемы
Как мне добавить данные в таблицы PART_ID, PART_TYPE и RACK?
<?php
// Parse the form data and add inventory item to the system
if (isset($_POST['PART_ID'])) {
$id = mysql_real_escape_string($_POST['PART_ID']);
$PART_DESC = mysql_real_escape_string($_POST['PART_DESC']);
$SERIAL_NUM = mysql_real_escape_string($_POST['SERIAL_NUM']);
$RACK_NUM = mysql_real_escape_string($_POST['RACK_NUM']);
$PART_TYPE_ID = mysql_real_escape_string($_POST['PART_TYPE_ID']);
$LOCATION = mysql_real_escape_string($_POST['LOCATION']);
$PART_TYPE_DESC = mysql_real_escape_string($_POST['PART_TYPE_DESC']);
// See if that product name is an identical match to another product in the system
$sql = mysql_query("SELECT PART_ID FROM PART WHERE PART_ID='$id' LIMIT 1");
$productMatch = mysql_num_rows($sql); // count the output amount
if ($productMatch > 0) {
echo 'Sorry you tried to place a duplicate "Product Name" into the system, <a href="inventory_list.php">click here</a>';
exit();
}
// Add this product into the database now
**$sql = mysql_query("INSERT INTO PART (PART_ID, PART_DESC, SERIAL_NUM, RACK_NUM, PART_TYPE_ID)
VALUES('$id','$PART_DESC','$SERIAL_NUM','$RACK_NUM','$PART_TYPE_ID')") or die (mysql_error());**
header("location: inventory_list.php");
exit();
}
?>
Комментарии:
1. итак, в чем ваш вопрос или в чем проблема?
2. это такой странный способ выполнения запросов.. используйте PDO
3. @yes 123 есть ли более эффективный способ сделать это?
4. да, используя pdo php.net/manual/en/pdo.prepare.php
5. Вывод ошибок БД пользователям, не являющимся администраторами, раскрывает слишком много информации .
Ответ №1:
Майкл, если я понял твою проблему, тебе просто нужно выполнить 2 других SQL INSERT, чтобы добавить данные в другую таблицу
$sql = mysql_query("INSERT INTO PART (PART_ID, PART_DESC, SERIAL_NUM, RACK_NUM, PART_TYPE_ID)
VALUES('$id','$PART_DESC','$SERIAL_NUM','$RACK_NUM','$PART_TYPE_ID')") or die (mysql_error());
$currentID = mysql_inserted_id();
$sql2 = mysql_query("INSERT INTO PART_TYPE [..]");
$sql3 = mysql_query("INSERT INTO RACK [..]");
Вы можете использовать $currentId, если вам нужен идентификатор последней записи, преобразованной в ЧАСТЬ
Но все же я настоятельно рекомендую вам изучить PDO http://php.net/pdo для sql
Комментарии:
1. Да, это правильно, разрешит ли это результаты, не показывающие элементы, которых нет в таблице PART_TYPE?
2. Я не понимаю, в чем ваша проблема
3. Когда я добавляю элементы, которых нет в списке из-за внутренних объединений, они добавляются, но они выбирают запрос, который не отображает никаких новых элементов из-за моего оператора insert. Если он выполняет оператор select onlu, то в таблице part не отображаются новые элементы. Итак, если я добавлю новый элемент с идентификатором 1001, он не будет указан, только элемент 1003 и так далее будет отображаться с использованием инструкции join.
4. @michaael тогда ваш запрос SELECT неверен, потому что ПОЛНОЕ ВНЕШНЕЕ объединение выбирает записи без внешних ключей в другой таблице
Ответ №2:
ваше управление таблицами неверно, вы никогда не используете стрелки просто для того, чтобы показать, что вы соединяете их с той таблицей из этой таблицы, а скорее с ключа в первой таблице на внешний ключ во второй таблице, вот с чего я бы начал, возможно, лучшей идеей было бы объединить их с помощью JOIN
посмотрите в Google, как работают объединения, это может быть причиной…
Я согласен с @yes123, это правильный способ вставки в таблицы, если у вас есть программа под названием heidisql
, используйте ее, потому что есть окно для запуска ваших запросов… этот способ проверить, правильно ли это написано, также использует mysql_error.
Отлаживайте, отлаживайте и еще раз отлаживайте свой код.
Ответ №3:
Ваши таблицы оформлены неправильно. Попробуйте эту структуру таблиц .
В вашей части базовой таблицы. —
Столбцы в этом должны быть:
Part_id
part_desc
serial_num
part_type должен содержать следующие столбцы:
part_type_id
part_type_desc
part_id -> foreign key to the parent table
Таблица rack должна быть:
Rack_num
location
part_id -> foreign key to the parent table.
Таким образом, ваш запрос select для получения всей информации, связанной с деталями, будет:
$sql="select * from part join part_type pt on tp.part_id=part.part_id join Rack_num rn on rn.part_id=part.part_id";
При такой структуре данные остаются нормализованными. И является гибким, поэтому, если детали находятся на нескольких стойках, вы просто переходите к таблице rack и добавляете новый номер стойки и идентификатор детали.
Комментарии:
1. Спасибо за ответ, это было для задания бакалавров по созданию сайта инвентаризации с нуля. В конце концов я разобрался с этим и получил пятерку по заданию и презентации. К сожалению, я не получил работу программиста, и сейчас я работаю над докторской диссертацией, вау, как летит время.
2. поздравляю с получением пятерки по вашей презентации. Не беспокойтесь о работе, которую вы в конечном итоге получите.. продолжайте пытаться.