Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MySQL, PHP - polaczenie z trzema bazami i sumowanie.
Forum PHP.pl > Forum > PHP
fcppl
witam,
Mam trzy te same bazy (trzy te same strony z produktami na różnych domenach).
Chciałem połączyć się do pierwszej, drugiej i trzeciej bazy i pobrać dane z kolumny product_sales
Dodać te wartości i uzupełnić we wszystkich trzech bazach aktualne dane.

Baza na każdej stronie jest identyczna:

Baza 1
ID | product_in_stock | product_sales | id_prod
1 | 30 | 5 | PL555

Baza 2
ID | product_in_stock | product_sales | id_prod
1 | 30 | 4 | PL555

Baza 3
ID | product_in_stock | product_sales | id_prod
1 | 30 | 2 | PL555

Czyli zapytanie powinno wyglądać tak:
Dodaje (product_in_stock) 5 + 4 + 2 = 11

I wartość 11 w kolumnie product_in_stock aktualizuje się w trzech bazach.

Nie wiem jak się za to zabrać na trzech bazach jednocześnie. Z jedna baza danych nie mam problemu.
Proszę o pomoc.
nospor
Na pewno chodzi ci o 3 rozne bazy a nie o 3 rozne tabele? Bo to dosc znaczaca roznica
fcppl
tak, chodzi o trzy różne bazy.

Chodzi mi o zebranie tych informacji z trzech baz danych i na podstawie sprzedanych produktów uzupełnić informację.

Przykład: Mam 4 rowery w szybkiej dostawie (48 godzin). Wszystkie są wystawione na osobnym sklepie i chciałem policzyć ilość sprzedanych w danym sklepie i jeżeli suma będzie zero to produkt się przełączy na standardową dostawę np: 2 tygodnie.

Z wszystkim sobie daję radę tylko problem mam z tym co opisałem w poście powyżej.
nospor
No to najzwyklej w swiecie musisz sie polaczyc do tych 3 baz i pobrac info ktore ci interesuje. Polaczyc sie chyba umiesz?
viking
Bazy są na tej samej maszynie?
fcppl
Połączyć się z bazami nie mam problemu. Nie wiem tylko jak mam odebrać te dane i zsumować żeby później je zapisać do 3 baz.

Nie bazy są na osobnych maszynach.
nospor
No jak to jak? Laczysz sie z baza, robisze select by pobrac liczbe elementow i tak 3 razy.
Dodajesz sobie te 3 liczby a potem na kazdej z baz robisz update. Taka sama logika co z jedna baza danych przy pobieraniu danych i update tylko ze tu powtorzona 3 razy
fcppl
Mogę prosić o jakiś prosty przykład jak to zrobić 3 raz. Tzn pobrać dane, dodac i zrobic update?
nospor
Cytat
jak to zrobić 3 raz

Dokladnie tak samo jak 1 raz tylko ze powtorzone dla 3 baz....

pokaz jak to robisz 1 raz
fcppl
Najpierw sie łącze do bazy A i B i wyświetlam tylko produkty które maja wpisana wartość w kolumnie id_prod

$result_a = mysqli_query($conn_a,"SELECT * FROM tabela WHERE id_prod is not null");

$result_b = mysqli_query($conn_b,"SELECT * FROM tabela WHERE id_prod is not null");

I tutaj się zaczynają moje problemy bo nie wiem zsumować kolumny product_sales. próbuję w pętli "while", ale wyświetla mi dane jako osobne z dwóch baz danych.

Chodzi mi też o to, że takich produktów maja kilka więc za jednym razem chce sprawdzić i aktualizować kilka produktów.

p.s na ta chwilę nie robię update bo utkwiłem na sumowaniu.
gino
nie
Kod
SELECT * FROM tabela...


tylko
Kod
SELECT SUM(product_in_stock) AS sum_sales FROM tabela ...


i pobierz do zmiennej to sum_sales i tak 3 razy

gino
fcppl
Udało mi się zrobić takim zapytanie z pomocą podpowiedzi gino i fajnie dostaje wynik w SQL z poszczególnej bazy, tylko za cholerę nie mogę wyciągnąć do zmiennej sum_sales i zsumować te pola z dwóch baz. Próbowałem w pętli "while" ale niestety nie daje rady. Mogę prosić o jakiś przykład jak to zrobić?

$result_a = mysqli_query($conn_a,"SELECT SUM (product_sales) AS sum_sales, id_prod as id_produkt FROM tabela WHERE id_prod is not null GROUP BY id_prod")

$result_b = mysqli_query($conn_b,"SELECT SUM (product_sales) AS sum_sales, id_prod as id_produkt FROM tabela WHERE id_prod is not null GROUP BY id_prod")
gino
piszę z pamięci więc do sprawdzenia, dawno nie używałem mysqli:

Kod
$my_con1 = new mysqli("host1", "user", "password", "db_name1");
$my_con2 = new mysqli("host2", "user", "password", "db_name2");
$my_con3 = new mysqli("host3", "user", "password", "db_name3");

$qr = "SELECT SUM(product_in_stock) AS sum_sales FROM tabela WHERE id_prod is not null";

$result = $my_con1->query($qr);
$tab = $resutl->fetch_assoc();
$sum_sales = $tab['sum_sales'];
$result->free();

$result = $my_con2->query($qr);
$tab = $resutl->fetch_assoc();
$sum_sales += $tab['sum_sales'];
$result->free();

$result = $my_con3->query($qr);
$tab = $resutl->fetch_assoc();
$sum_sales += $tab['sum_sales'];
$result->free();

echo $sum_sales;


plus obsługę błędów połączenia trzeba zrobić.
plus cały ten rozdział do przeczytania.

Edit: po zrobienu inserta zamknięcie połączeń.

gino
fcppl
dziękuje za pomoc. Zastosowałem się do wskazówek i coś ruszyło do przodu smile.gif.

Zrobiłem tak:

  1. $my_con1 = new mysqli('localhost', 'user1', 'pass1', 'db1');
  2. $my_con2 = new mysqli('localhost', 'user1', 'pass2', 'db2');
  3.  
  4.  
  5. $qr = "SELECT SUM(product_sales) AS sum_sales, id_prod as id FROM tabela WHERE id_prod is not null GROUP BY id_prod";
  6.  
  7. $result = $my_con1->query($qr);
  8.  
  9. $tab = $result->fetch_assoc();
  10. $sum_sales = $tab['sum_sales'];
  11. $id = $tab['id'];
  12. $result->free();
  13.  
  14.  
  15. $result = $my_con2->query($qr);
  16.  
  17. $tab = $result->fetch_assoc();
  18. $sum_sales += $tab['sum_sales'];
  19. $id = $tab['id'];
  20. $result->free();
  21.  
  22. echo $id .' - '. $sum_sales;


Wynik otrzymuję taki: PL8184 - 9, teraz własnie nie wiem jak to wyświetlić w pętli zeby mi pokazało wszystkie trzy produkty czyli:

PL8184 - 9
PL8185 - 0
PL8186 - 12

Tutaj załączam jak wygląda wynik po zapytaniu w phpmyadmin:


gino
no ok, tylko teraz chcesz coś innego niż w pierwszym poście, bo chciałeś sumować konkretne ilości, w każdym zapytaniu zamiast:

Kod
$tab = $result->fetch_assoc();
$sum_sales = $tab['sum_sales'];
$id = $tab['id'];


daj:

Kod
if ($result = $my_con1->query($qr)) {

    while ($tab = $result->fetch_assoc()) {
        echo $tab['id']."-".$tab['sum_sales'];
    }
    $result->free();
}


zmieniając za każdym razem $my_con1na kolejny.

gino
fcppl
to rozwiązanie wyświetla w pętli dane do danej bazy (osobno), nie sumuje produktów żeby wynik był taki:

PL8184 - 9 (PL8184 z bazy 1 = 5 i PL8184 z bazy 2 = 4 razem 9)
PL8185 - 0 (PL8185 z bazy 1 = 0 i PL8185 z bazy 2 = 0 razem 0)
PL8186 - 12 (PL8186 z bazy 1 = 2 i PL8186 z bazy 2 = 10 razem 12)
Tomplus
Pomyśl trochę dlaczego nie sumuje?

Wystarczy trochę zmodyfikować i:

  1. $salesElement = [];
  2. while ($tab = $result->fetch_assoc()) {
  3. $salesElement[$tab['id']] = isset($salesElement[$tab['id']]) ? $salesElement[$tab['id']] + $tab['sum_sales'] : $tab['sum_sales'];
  4. }


Linia skomplikowana aby nie pojawiły sie notice Undefined offset.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.