BG Development


  Reply to this topicStart new topicStart Poll

> PHP & PDO - fetchAll() и как да инсертна масива, PHP & PDO - fetchAll() и следващ инсерт
rolan
Публикувано на: 01-11-2017, 20:42
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 11
Регистриран на: 29.03.12



Здравейте,

Опитвам се да инсертна (част от) таблица от база данни, във друга таблица със съща структура във друга база на друг хост.

CODE

// new connection to the MT -  първа база
$dbMT = new PDO("mysql:host=$dbHostMT;dbname=$dbNameMT;charset=$dbCharMT",$dbUserMT,$dbPassMT);
$dbMT->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbMT->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

// new connection to SJ - втора база
$dbSJ = new PDO("mysql:host=$dbHostSJ;dbname=$dbNameSJ;charset=$dbCharSJ",$dbUserSJ,$dbPassSJ);
$dbSJ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbSJ->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

// изпълнявам първото query
$stmt = $dbMT->query("SELECT user_id,login,pass FROM user");
$results = $stmt->fetchAll(PDO::FETCH_OBJ);

// проверявам какво съм направил до тука
echo "<pre>";
print_r($results);
echo "</pre>";


В брaузера ми показва това:
CODE

Array
(
   [0] => stdClass Object
       (
           [user_id] => 1
           [login] => jdejdjd
           [pass] => sdkjvjeirjfveirebvueirfveivveverfverrrrtrbtr
       )

   [1] => stdClass Object
       (
           [user_id] => 2
           [login] => jdejdjd
           [pass] => sdkjvjeirjfveirebvueirfveivveverfverrrrtrbtr
       )

   [2] => stdClass Object
       (
           [user_id] => 8
           [login] => jdejdjd
           [pass] => sdkjvjeirjfveirebvueirfveivveverfverrrrtrbtr
       )
......
......
......
)


Решението:

CODE

   $stmt = $dbMT->query("SELECT user_id,login,pass FROM user");
   $results = $stmt->fetchAll(PDO::FETCH_OBJ); $row_count = $stmt->rowCount();
   
   // нямам нужда повече от тези
   // echo "<p>" . $row_count . ' rows selected' . "</p>";
   // echo "<p>Printing the user table:</p>";
   // echo "<pre>"; print_r($results); echo "</pre>";
   // truncate am_user
   // $stmt = $dbSJ->prepare("TRUNCATE TABLE am_user");
   // $stmt->execute();
   
   // insert $results
   $sql = $dbSJ->prepare("INSERT IGNORE INTO am_user (user_id,login,pass) VALUES (:user_id,:login,:pass)");
   $dbSJ->beginTransaction();
   try {
       foreach ($results as $result) {
           $sql->execute([
               ":user_id" => $result->user_id,
               ":login" => $result->login,
               ":pass" => $result->pass
           ]);
       }
       $dbSJ->commit();
   } catch (PDOException $e) {
       $dbSJ->rollBack();
       echo $e->getMessage();
   }


Дано да е от полза на някой, който има същата задача и не му се търси оптималния вариант във десетки отговора в стек овърфлоу.

Поздрави,

/rolan

Това мнение е било редактирано от rolan на 04-11-2017, 20:37
PMEmail Poster
Top
hristonev
Публикувано на: 01-11-2017, 21:21
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 32
Регистриран на: 19.09.17



Тук Рами е дал решение на твоя проблем. Иначе по-добре перкай TRUNCATE не DELETE.
PMEmail Poster
Top
rvc
Публикувано на: 01-11-2017, 21:51
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2467
Регистриран на: 13.05.11



QUOTE
With INSERT ... SELECT, you can quickly insert many rows into a table from the result of a SELECT statement, which can select from one or many tables. For example:

QUOTE
INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
PMEmail PosterUsers Website
Top
rolan
Публикувано на: 01-11-2017, 22:43
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 11
Регистриран на: 29.03.12



@rvc базите са различни и на различни сървъри, макар таблицата user да е еднаква. @hristonev точно от това имах нужда.Поздрави и успехи!

Редакция:

По елегантно ми се видя да го вкарам като масив от обекти както е в актуализирания ОП. Благодаря!

/rolan

Това мнение е било редактирано от rolan на 04-11-2017, 20:40
PMEmail Poster
Top
rolan
Публикувано на: 04-11-2017, 01:49
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 11
Регистриран на: 29.03.12



Задачата решена. ОП актуализиран. Благодаря!

/rolan

Това мнение е било редактирано от rolan на 04-11-2017, 20:40
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0