Verification: a143cc29221c9be0

Mysql одно к многим php

Mysql одно к многим php

Ответ 1

Предупреждение: функции mysql_xx устарели с php 5.5 и удалены с php 7.0, поэтому используйте функции mysqli_xx. Вы можете сделать несколько вызовов mysql_connect(), но, если параметры одинаковы, вам нужно передать true для параметра '$new_link' (четвертый), иначе одно и то же соединение будет использоваться повторно. Например:

$dbh1 = mysql_connect($hostname, $username, $password); 

$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1);

mysql_select_db('database2', $dbh2);

Затем для запроса к базе данных 1 передается идентификатор первой ссылки:

mysql_query('select * from tablename', $dbh1);

И для базы данных 2 передайте вторую:

mysql_query('select * from tablename', $dbh2);

Если вы не передали идентификатор соединения, то будет использоваться последнее созданное соединение (в данном случае то, которое представлено $dbh2), например:

mysql_query('select * from tablename');

Другие варианты:

Если пользователь MySQL имеет доступ к обеим базам данных и они находятся на одном хосте (т. е. обе БД доступны из одного соединения), вы можете:

  1. Держать одно соединение открытым и вызывать mysql_select_db() для переключения между ними по мере необходимости. Я не уверен, что это чистое решение, и в итоге вы можете запросить не ту базу данных.

  2. Указывайте имя базы данных, когда ссылаетесь на таблицы в своих запросах (например, SELECT * FROM database2.tablename). Это, скорее всего, будет сложно реализовать.

Ответ 2

Если вы используете PHP5 (а вы должны это делать, учитывая, что PHP4 уже устарел), вам следует использовать PDO, поскольку он постепенно становится новым стандартом. Одним (очень) важным преимуществом PDO является то, что он поддерживает связанные параметры, что делает код намного более безопасным.

Вы будете подключаться через PDO следующим образом:

try {

  $db = new PDO('mysql:dbname=databasename;host=127.0.0.1', 'username', 'password');

} catch (PDOException $ex) {

  echo 'Ошибка подключения: ' . $ex->getMessage();

}

(Конечно, замените имя базы данных, имя пользователя и пароль).

Затем вы можете запросить базу данных следующим образом:

$result = $db->query("select * from tablename");

foreach ($result as $row) {

  echo $row['foo'] . "\n";

}

Или, если у вас есть переменные:

$stmt = $db->prepare("select * from tablename where id = :id");

$stmt->execute(array(':id' => 42));

$row = $stmt->fetch();

Если вам нужно открыть несколько соединений одновременно, вы можете просто создать несколько экземпляров PDO:

try {

  $db1 = new PDO('mysql:dbname=databas1;host=127.0.0.1', 'username', 'password');

  $db2 = new PDO('mysql:dbname=databas2;host=127.0.0.1', 'username', 'password');

} catch (PDOException $ex) {

  echo 'Ошибка соединения: ' . $ex->getMessage();

}

Ответ 3

Вместо mysql_connect используйте mysqli_connect.

mysqli предоставляет функциональность для подключения нескольких баз данных одновременно.

$Db1 = new mysqli($hostname,$username,$password,$db_name1); 

// это 1 соединение с БД

$Db2 = new mysqli($hostname,$username,$password,$db_name2); 

// это 2 соединение с БД

Ответ 4

Попробуйте использовать приведенный ниже код:

$conn = mysql_connect("hostname","username","password");

    mysql_select_db("db1",$conn);

    mysql_select_db("db2",$conn);

    $query1 = "SELECT * FROM db1.table";

    $query2 = "SELECT * FROM db2.table";

Вы можете получить данные вышеуказанного запроса из обеих баз данных следующим образом:

$rs = mysql_query($query1);

while($row = mysql_fetch_assoc($rs)) {

    $data1[] = $row;

}

$rs = mysql_query($query2);

while($row = mysql_fetch_assoc($rs)) {

    $data2[] = $row;

}

print_r($data1);

print_r($data2);

Ответ 5

$dbh1 = mysql_connect($hostname, $username, $password);  

$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1); 

mysql_select_db('database2',$dbh2); 

mysql_query('select * from tablename', $dbh1);

mysql_query('select * from tablename', $dbh2);

Это наиболее очевидное решение, которое я использую, но помните, что, если имя пользователя/пароль для обеих баз данных абсолютно одинаковы на одном и том же хосте, это решение всегда будет использовать первое соединение. Поэтому не паникуйте, что в таком случае решение не сработает. Что вам нужно сделать, так это создать 2 разных пользователя для двух баз данных, и все заработает.

INNER JOIN

Прежде чем идти дальше и рассматривать другие типы связей, стоит изучить ещё один оператор SQL - INNER JOIN. Он используется для объединения строк из двух и более таблиц, основываясь на отношениях между ними. Для запроса используется следующий синтаксис:

SELECT столбцы FROM таблица1 INNER JOIN таблица2 ON условие_для_связи

Чтобы получить всех пользователей вместе с их профилями нам нужно выполнить следующий запрос:

SELECT * FROM users INNER JOIN profiles ON users.id = profiles.id;

Каждая строка из левой таблицы, сопоставляется с каждой строкой из правой таблицы, после этого проверяется условие.

Если мы хотим выбрать только некоторые столбцы, то после оператора SELECT нужно перед именем поля явно указать название таблицы, из которой оно берется:

SELECT users.id, users.name, profiles.vk_link FROM users INNER JOIN profiles ON users.id = profiles.id;

Алиасы

Согласитесь, в прошлом примере пришлось довольно много букв написать. Чтобы этого избежать, в запросах можно использовать алиасы для имён таблиц. Для этого после имени таблицы можно написать AS alias. Давайте для таблицы users зададим алиас - u, а для таблицы profiles - p. Эти алиасы теперь можно использовать в любой части запроса:

SELECT u.id, u.name, p.vk_link FROM users AS u INNER JOIN profiles as p ON u.id = p.id;

Заметьте, запрос сократился. Писать запрос с использованием алиаса быстрее.

Как уже говорилось выше, алиас можно использовать в любой части запроса, в том числе и в условии WHERE:

SELECT u.id, u.name, p.vk_link FROM users AS u INNER JOIN profiles as p ON u.id = p.id WHERE u.id=2;

Один-ко-многим

При такой связи одной записи в одной таблице соответствует несколько записей в другой. В начале этого урока мы рассмотрели как раз такой пример, когда говорили о добавлении в таблицу с новостями поля author_id. Таким образом, у каждой статьи есть один автор. В то же время у одного автора может быть несколько статей.
Давайте создадим таблицу для статей. Пусть в ней будет идентификатор статьи, её название, текст, и идентификатор автора.

CREATE TABLE `my_db`.`articles` (
 `id` INT NOT NULL AUTO_INCREMENT ,
 `author_id` INT NOT NULL ,
 `name` TEXT NOT NULL ,
 `text` TEXT NOT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Добавим несколько статей:

INSERT INTO `articles`(`author_id`, `name`, `text`) VALUES (1, "Пингвины научились летать", "Шокирующая новость поразила общественность!");
INSERT INTO `articles`(`author_id`, `name`, `text`) VALUES (1, "В городе N обнаружен зомби-вирус", "Шокирующая новость поразила общественность!");
INSERT INTO `articles`(`author_id`, `name`, `text`) VALUES (2, "Котики снижают уровень стресса", "Успокаивающая новость расслабила общественность");

Запросим теперь эти записи, чтобы убедиться, что всё ок

SELECT * FROM articles;

Давайте теперь выведем имена статей вместе с авторами. Для этого снова воспользуемся оператором INNER JOIN.

SELECT a.name, u.name FROM articles AS a INNER JOIN users AS u ON a.author_id=u.id;

Как видим, у Ивана две статьи, и ещё одна у Ольги.

Если бы мы захотели на странице со статьей выводить рядом с автором краткую информацию о нем, нам нужно было бы сделать ещё один JOIN на табличку profiles.

SELECT a.name, u.name, p.about FROM articles AS a INNER JOIN users AS u ON a.author_id=u.id INNER JOIN profiles AS p ON u.id=p.id;

Изи!

LEFT JOIN

Помимо INNER JOIN, есть ещё несколько операторов класса JOIN. Один из самых частоиспользуемых - LEFT JOIN. Он позволяет сделать запрос к двум таблицам, между которыми есть связь, и при этом для одной из таблиц вернуть записи, даже если они не соответствуют записям в другой таблице.
Как например, если бы мы хотели вывести не только пользователей, у которых есть статьи, но и тех, кто "халтурит" :)

Давайте для начала сделаем запрос с использованием INNER JOIN, который выведет пользователей и написанные ими статьи:

SELECT u.id, u.name, a.name FROM users AS u INNER JOIN articles AS a ON u.id=a.author_id;

Теперь заменим INNER JOIN на LEFT JOIN:

SELECT u.id, u.name, a.name FROM users AS u LEFT JOIN articles AS a ON u.id=a.author_id;

Видите, вывелись записи из левой таблицы (users), которым не соответствует при этом ни одна запись из правой таблицы (articles).

Один ко многим "через"

Мы уже рассматривали метод связывания "один ко многим" - hasMany. Метод "hasManyThrough" позволяет сделать связывание сразу нескольким моделей с указанием полей, даже если не все таблицы имеют поля, указывающие друг на друга.

Предположим, что у нас есть следующие таблицы со столбцами (типы данных указаны напротив названий столбцов, а в скобках записаны названия таблиц):

[countries]
   id - integer
   name - string

[users]
   id - integer
   country_id - integer
   name - string

[posts]
   id - integer
   user_id - integer
   title - string

Как видно, таблица posts не содержит поля country_id. Но отношение "ко многим через" позволит получить доступ к posts через country: $country->posts. Для выполнения такого запроса Eloquent найдёт country_id в таблице users, и получит совпадающие id с значанием user_id в таблице posts.

hasManyThrough('App\Post', 'App\User');
   }
}
?>

Первый параметр метода "hasManyThrough" является именем конечной модели, а второй параметр - это имя промежуточной. Если нужно вручную указать ключи для моделей, то третий параметр - это имя ключа промежуточной модели, четвёртый - имя ключа конечной модели, а пятый - локальный ключ. Для нашего примера это будет выглядеть так:

hasManyThrough(
         'App\Post', 'App\User',
         'country_id', 'user_id', 'id'
      );
   }
}
?>