Php pdo foreign key

Вставка PDO в таблицу с внешними ключами

Как упоминалось в комментарии ниже: обычно я получаю идентификатор из поля выбора. Я не могу этого сделать, потому что это будет скрипт, выполняющий запрос, а не пользователь.

Обычно вы выбираете категорию и тип из выпадающего списка или какого-либо другого виджета, который ищет допустимые параметры и возвращает идентификатор. Вы полагаетесь на простое поле ввода? — Álvaro González

Я знаю это, потому что из поля выбора я могу получить идентификатор. Я пытаюсь автоматизировать вещи. это будет сценарий, а не пользователь, который будет вставлять продукты. — Gravy

Честно говоря, я не понимаю, как сценарий мешает вам обрабатывать идентификаторы, но я все равно дал ответ. — Álvaro González

4 ответы

вы уверены, что это то, что вы хотите?

$sql = 'INSERT INTO Products SET Name = :name WHERE CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND TypeId IN (SELECT Id FROM Types WHERE Type = :type)' 

Я думаю, ты пытаешься использовать UPDATE

$sql = 'UPDATE Products SET Name = :name WHERE CategoryId IN (SELECT Id FROM Categories WHERE Cat = :category) AND TypeId IN (SELECT Id FROM Types WHERE Type = :type)' 

Я хочу вставить новую строку в таблицу. Я хочу, чтобы запрос определил правильный идентификатор для внешних ключей. например, предполагая, что тип перчатки имеет идентификатор 1, а категория одежды имеет идентификатор 5. Затем я хочу вставить в таблицу продуктов (название: Детская розовая перчатка, идентификатор типа: 1, идентификатор категории: 5) — подливка

Читайте также:  Web server run java

Mysql не поддерживает WHERE в операторе вставки, пожалуйста, проверьте эту ссылку: stackoverflow.com/questions/485039/mysql-insert-где-запрос — jcho360

MySQL позволяет комбинировать ВЫБРАТЬ + ВСТАВИТЬ в одном запросе:

INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100; 

. но мне было бы все равно. Вы не можете выполнить правильную проверку ошибок, если вы выполняете три разных действия в одном запросе.

Мой совет: сначала убедитесь, что существуют категория и тип, соответствующие заданным именам. На этом шаге вы можете легко получить соответствующие идентификаторы, которые позволят вам выполнить простую вставку. Кроме того, если вам нужно вставить много продуктов, вы можете проверить сначала и один раз.

Понятно о проверке существующих категорий и типов. Спасибо. — подливка

В дополнение к ответу @ Álvaro G. Vicario вы также можете сделать что-то вроде (работает в обычном sql, я не пробовал со связанными переменными):

$sql = 'INSERT INTO Products SET Name = :name, CategoryId = (SELECT Id FROM Categories WHERE Cat = :category), TypeId = (SELECT Id FROM Types WHERE Type = :type)'; 

Но я бы всегда сначала проверял существующие категории и типы, вставлял там, где это необходимо, и получал требуемые идентификаторы, поскольку это приведет к неожиданным результатам, если во внутренних выборках нет совпадений.

Это именно то, что я хотел. Но я понимаю, что вы имеете в виду, говоря о проверке существующих категорий и типов в первую очередь. — подливка

Прежде всего, вам нужно выяснить, какая таблица содержит данные внешнего ключа.

Затем вам нужно получить все возможные значения из таблицы внешнего ключа.

Наконец, вам нужно создать раскрывающийся список или что-то подобное, чтобы дать возможность выбрать приемлемый внешний ключ.

$q=$db->prepare('SELECT ke.referenced_table_name assoc_table, ke.referenced_column_name assoc_col FROM information_schema.KEY_COLUMN_USAGE ke WHERE ke.referenced_table_name IS NOT NULL AND ke.table_schema=:database AND ke.table_name=:tablename AND ke.column_name=:col'); $q->bindValue(':database','mydatabasename'); //Set your database name here $q->bindValue(':tablename','Departments'); //Set your table name here $q->bindValue(':col','City'); //Set the column which foreign key values you want to have here if($q->execute()) < $foreingtable=$q->fetch(PDO::FETCH_ASSOC); $q=$db->prepare('SELECT '.$foreingtable['assoc_col'].' FROM '.$foreingtable['assoc_table']); if($q->execute()) echo json_encode($q->fetchAll(PDO::FETCH_COLUMN)); > else < header('http/1.1 500 Internal Server Error'); print_r($q->errorInfo()); exit; > 

Источник

php — PDO creating a table with a foreign key

I am having difficulty creating a table with MySQL (PDO) with a foreign key element, without the foreign key the table creates fine, but without I get this message:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

I have tried searching for a solution and adapting the code, but seem to keep coming across this. Is there a fix or am I being a wally?

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //sql to create the activity registered table $sql = "CREATE TABLE Activity_Register ( Activity_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, participant_id INT(6) FOREIGN KEY (participant_id) REFERENCES participants, entry_number INT(2), recorded_result INT(6), entry_date TIMESTAMP )"; // use exec() because no results are returned $conn->exec($sql); echo "Table Activity Recorder created successfully"; > catch(PDOException $e) < echo $sql . "
" . $e->getMessage(); > $conn = null; ?>

Answer

Solution:

PRIMARY KEY in a column’s definition is shorthand for a separate definition that reads PRIMARY KEY (`column_name`)

FOREIGN KEY has no such shorthand.

`participant_id` INT(6), FOREIGN KEY (`participant_id`) REFERENCES `participants` (`id. `) 

Note that you neglected the column name for the referenced table, and you should probably also have ON DELETE and ON UPDATE parameters too.

Share solution ↓

Additional Information:

Didn’t find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Similar questions

Find the answer in similar questions on our website.

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

About the technologies asked in this question

PHP

PHP (from the English Hypertext Preprocessor — hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites. The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/

MySQL

DBMS is a database management system. It is designed to change, search, add and delete information in the database. There are many DBMSs designed for similar purposes with different features. One of the most popular is MySQL. It is a software tool designed to work with relational SQL databases. It is easy to learn even for site owners who are not professional programmers or administrators. MySQL DBMS also allows you to export and import data, which is convenient when moving large amounts of information.
https://www.mysql.com/

Welcome to programmierfrage.com

programmierfrage.com is a question and answer site for professional web developers, programming enthusiasts and website builders. Site created and operated by the community. Together with you, we create a free library of detailed answers to any question on programming, web development, website creation and website administration.

Get answers to specific questions

Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.

Help Others Solve Their Issues

Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.

Источник

Оцените статью