PHP / MYSQL вставка данных в несколько таблиц

#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. поздравляю с получением пятерки по вашей презентации. Не беспокойтесь о работе, которую вы в конечном итоге получите.. продолжайте пытаться.