Как извлечь несколько значений из базы данных и установить его как переменную

#mysql #perl

#mysql #perl

Вопрос:

Внутренняя таблица (1)

 ID      Name      Address        Phone       InsertDate

1      Andrew     12-A,ABC      576849203    2014/05/06
1      Andrew     12-A,ABC      123456789    2014/07/08
  

Внутренняя таблица (2)

 ID      Name      Address        Phone       InsertDate

1      Andrew     12-A,ABC       123456789    2014/07/08
  

Проблема, с которой я столкнулся, заключается в том, что я Select * from table(1) where id='1' . Он получит две записи. Затем, когда я пытаюсь вставить в table(2) . В таблице (2) отображается только одна запись вместо 2 записей.

Что мне следует сделать, чтобы я мог получить две записи из таблицы (1) и вставить в таблицу (2)?

Мой пример кода:

 $mysql="Select * from table(1) where id='1'";
**Perform the query**

**Retrieve values**
$sth->bind_col(1, $Name);
$sth->bind_col(2, $Address);
$sth->bind_col(3, $Phone);
$sth->bind_col(4, $InsertDate);

if($sth->fetch()){
  $mysql="Insert into table(2) values($Name,$Address,$Phone,InsertDate)";
  **Perform the query**
}
  

Спасибо за просмотр, комментарии и ответы!

Комментарии:

1. if($sth->fetch()) => while($sth->fetch()) и использовать заполнители для извлечения и вставки. perlmonks.org/?node_id=284436

Ответ №1:

Вы делаете SELECT * FROM table(1) так, что вы извлекаете все столбцы. Во-первых, ID поэтому ваша привязка к столбцу неверна, и трудно поверить, что ваш код правильно копирует хотя бы одну запись. Кроме того, вы выполняете fetch только один раз, поэтому вы пытаетесь вставить только одну из двух строк в table(2) .

Вам нужно написать что-то вроде этого

 my $read = $dbh->prepare(<<'__END_SQL__');
SELECT Name, Address, Phone, InsertDate
FROM table(1)
WHERE ID = ?
__END_SQL__

my $write = $dbh->prepare(<<'__END_SQL__');
INSERT INTO table(2) (Name, Address, Phone, InsertDate)
VALUES (?, ?, ?, ?)
__END_SQL__

$read->execute(1);

while (my $row = $read->fetchrow_arrayref) {
  $write->execute(@$row);
}
  

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

 my copy = $dbh->prepare(<<'__END_SQL__');
INSERT INTO table(2) (Name, Address, Phone, InsertDate)
  SELECT Name, Address, Phone, InsertDate
  FROM table(1)
  WHERE ID = ?
__END_SQL__

$copy->execute(1);
  

Комментарии:

1. Мне нравится ваш стиль heredoc для операторов SQL. Я понимаю, что это близко к тому, что рекомендует Conway, но я все равно делаю закладки для дальнейшего использования. 1

Ответ №2:

прежде всего, убедитесь, что в table2 id или name или каком-либо другом поле не установлено значение primary, иначе это не позволит вам вставлять повторяющиеся записи..

попробуйте этот PHP-код…

 result=mysql_query(" select * from table where id=1 ");

while($row=mysql_fetch_assoc($result))
{
$name=$row["Name"];
$address==$row["address"];
$phone==$row["phone"];
$insertdate=$row["insertdate"];

mysql_query( "insert into table2(name,address,phone,insertdate) values('$name','$address','$phone','$insertdate') ");

}
  

Комментарии:

1. Но … это вопрос Perl

2. спасибо, я действительно думал, что проблема в первичных ключах, предоставленных php для ссылки, но согласен, что это ошибка….