Yêu cầu thg 8 28, 2017 5:37 SA 2560 0 2
  • 2560 0 2
0

Lấy dữ liệu từ nhiều database khác host trên PHP.

Chia sẻ
  • 2560 0 2

Chào các Bạn, trước tiên mình cũng xin tự giới thiệu là mình không có nhiều kiến thức về PHP, nhưng hiện tại mình đang cần làm 1 trang web phục vụ cho công việc hằng ngày của mình. Tra google rất nhiều rồi mà vẫn chưa tìm ra được guide hướng dẫn, nên hôm nay mình muốn hỏi hoặc xin cao kiếng của mấy Pro về PHP. Tình hình là mình đang build 1 trang web php đơn giản để truy vấn vào database, mình đang gặp vướng mắt là làm các nào mà mình có thể truy vấn nhiều dabase khác host cùng 1 lúc, ví dụ cụ thể cho các Pro hiểu ha. Database A (local) có 1 bảng là callreport, trong call report có các trường thông tin sau:

ID Name EXT IP
1 KH A 100,102,102,103,104 203.162.X.X

mình dùng Dropdown list đổ dữ liệu vào OK rồi. Nhưng mục đích chính của mình là dùng lại những dữ liệu này để bỏ vào lại một câu truy vấn khác (Database B khác host) Dữ liệu mình dùng lại từ Database A là EXT(cho câu query) và IP (cho $dbhost kết nối của kết nối mysql). Đại khái câu truy vấn ở database B nó như sau:

SELECT cnam as khachhang, COUNT(calldate) AS total_call FROM cdr WHERE calldate BETWEEN '2017-07-01 00:00:00' AND '2017-07-31 23:59:59' AND recordingfile <> '' AND (( cnum like '%%' AND dst IN (100,102,102,103,104)) OR (cnum IN (100,102,102,103,104) AND dst like '%%'))

Phần bôi đậm trong câu truy vấn mình vẫn phải nhập tay, có cách nào lấy dữ liệu từ trên truy vấn trước được không vậy các Pro. Tóm lại là mình cần dùng lại dữ liệu của EXT cho câu truy vấn SQL và IP cho kết nối với Database Khác. Có Pro nào có kinh nghiệm thì chỉ mình với. Mình xin cảm ơn trước

Avatar Tran Duc Thang @thangtd90
thg 8 28, 2017 7:20 SA

@toan.truong Bạn có thể làm rõ hơn một số vấn đề dưới đây được không 😃

  • Bạn có sử dụng Framework, hay CMS nào không?
  • Bạn đã có thể lấy dữ liệu từ 1 database chưa?
  • Bạn đang config thông tin đến Database server (hostname, username, password, database name, port) như thế nào?
  • Trong Code PHP bạn đang lấy dữ liệu như thế nào?
thg 8 28, 2017 7:50 SA

Chào Bạn, cảm ơn bạn đã reply. Như đã nói mình chưa học qua PHP chủ yếu tự mày mò thôi, nên ko rành chuyên môn cho lắm. Phần kết nối PHP vs Mysql mình điền tay vào(mình thấy một số trang chỉ bỏ vào trong 1 file *.db gì đó).Mình post code lên đây luôn bạn xem giúp mình nhé:

<?php $databaseHost = "203.162.XXX.XXX"; $databaseUser = "XXX"; $databasePassword = "XXXX"; $databaseName = "callreport"; $con=mysql_connect($databaseHost ,$databaseUser ,$databasePassword )or die ('Connection Error'); mysql_select_db("callreport",$con) or die ('Database Error'); ?> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width , initial-scale=1”"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <title>Call Report </title> </head> <body>

Call Report Form

<form calss="form-group" action="" method="post"> <table> <tr> <label for="KH">Customer</label>: <Select name="kh" class="form-control" > <option value="none">-----SELECT-----</option> <option value="all">ALL</option> <?php $dd_res=mysql_query("Select name_kh from callreport_list"); while($r=mysql_fetch_row($dd_res)) { echo "<option value='$r[0]'> $r[0] </option>"; } mysql_close ($conn); ?>
	</select>

    </tr>

    <tr>
        <th>From Date:</th>
        <td><input type="text" name="date1" class="form-control"  value="<?php echo date('Y-m-d'); ?>" /></td>
    </tr>

    <tr>
        <th>To Date:</th>
        <td><input type="text" name="date2" class="form-control"  value="<?php echo date('Y-m-d'); ?>" /></td>
    </tr>

 </table>
<button type="submit" class="btn btn-default">Submit</button>
</form>
    <div class="container">
        <h1>Call</h1>
        <table class="table table-hover ">
            <thead  class="active">
                <tr>
                    <th>Customer</th>
                    <th>Total Call</th>
                      </tr>
            </thead>
            <tbody>
           #   (câu truy vấn thứ 2 mình tính bỏ vào chỗ này" SELECT cnam as khachhang, COUNT(calldate) AS total_call

FROM cdr WHERE calldate BETWEEN '2017-07-01 00:00:00' AND '2017-07-31 23:59:59' AND recordingfile <> '' AND (( cnum like '%%' AND dst IN ($ phần này lấy dữ liệu từ EXT bảng trên)) OR (cnum IN ($ phần này lấy dữ liệu từ EXT bảng trên) AND dst like '%%'))" ) <?php While ($row = mysql_fetch_array($dd_res)): ?> <tr> <td><?php echo ($r['0']) ?></td> <td><?php echo ($r['total_call']); ?></td> </tr> <?php endwhile; ?> <?php mysql_close ($conn); ?> </tbody> </table> </body>

</div> </html> ...
thg 8 28, 2017 7:53 SA

mình đang phân vân là 1 là dùng cách bạn @nguyen.van.duong , 2 là dùng một cách khai báo database gì đó để có thể sử dụng multidatabase. Sorry mình ko rành, nên đụng tới đâu google tới đó ah

Avatar Tran Duc Thang @thangtd90
thg 8 28, 2017 8:30 SA

@toan.truong Bạn đã có thể dùng $con = mysql_connect($databaseHost, $databaseUser, $databasePassword ) để kết nối đến 1 DB rồi thì hoàn toàn có thể tạo ra $con2 = mysql_connect($databaseHost2, $databaseUser2, $databasePassword2) để kết nối đến DB còn lại mà. Sau đó gọi đến các câu truy vấn thì dùng connection 2 thay vì connection 1, kiểu như mysql_select_db("db2", $con2).

Có một vấn đề mà bạn có thể sẽ gặp phải đó là Mysql trên server thứ 2 của bạn có thể chỉ đang mở kết nối ở localhost, tức là ở bên ngoài sẽ không thể access được vào. Trước tiên bạn cần phải kiểm tra chắc chắn rằng bạn có thể vào được DB đó từ máy chạy server PHP đã, nếu không vào được thì bạn cần phải config lại Mysql trước. Còn vào OK rồi thì việc sử dụng 2 connection khác nhau để giải quyết vấn đề này cũng đơn giản thôi mà, cứ tạo 2 biến connection, khi nào cần query đến DB nào thì dùng connection tương ứng là được.

P/S: Bạn nên update lại phần code của mình, để chúng trong ``` ```

để tránh bị lỗi format như hiện tại.

thg 8 28, 2017 9:11 SA

OK Thanks @thangtd90, mình sẽ thử xem sao. Nhưng có cách nào tiện hơn nữa ko Thắng ơi, tại vì nếu vậy thì mỗi record thì mình phải tạo 1 truy vấn, KH A truy vấn A, B,.... mình đang muốn lấy tự động trong database A

2 CÂU TRẢ LỜI


Đã trả lời thg 8 28, 2017 7:15 SA
+1

Kết quả của câu truy vấn A gán vào biến, sau đó dùng lại ở câu B.

Chia sẻ
thg 8 28, 2017 7:59 SA

Thanks bạn gì đã trả lời.Như vậy phần thông tin database connect mình khai báo như thế nào bạn. Bạn có thông tin hay hướng dẫn nào không. Tại vì mình truy vấn nhiều database khác host.

Avatar Nguyen Van Duong @nguyen.van.duong
thg 8 28, 2017 9:21 SA

bạn code bằng php thuần hay Framework nào, nếu php thuần thì tạo 2 kết nối db thôi. Cách đơn giản nhất là khai báo 2 kết nối như sau:

<?php
$servername1 = "localhost1";
$username1 = "username1";
$password1 = "password1";
$db1 = "db1"';

// Create connection
$conn1 = new mysqli($servername1, $username1, $password1, $db1);

// Check connection
if ($conn1->connect_error) {
    die("Connection failed: " . $conn1->connect_error);
} 

$servername2 = "localhost2";
$username2 = "username2";
$password2 = "password2";
$db2 = "db2";

// Create connection
$conn2 = new mysqli($servername2, $username2, $password2, $db2);

// Check connection
if ($conn2->connect_error) {
    die("Connection failed: " . $conn2->connect_error);
} 

$sqlA =  'select ext from callreport ';
$extA = $conn1->query($sqlA);
$dataA = '';
while($row = $extA->fetch_assoc()) {
            $dataA .= $row['ext'] . ',';
 }
$sqlB = "SELECT cnam as khachhang, COUNT(calldate) AS total_call
FROM cdr WHERE calldate BETWEEN '2017-07-01 00:00:00' AND '2017-07-31 23:59:59'
               AND recordingfile <> ''
               AND (( cnum like '%%' AND dst IN ($dataA)) OR (cnum IN ($dataA) AND dst like '%%'))";

$cnameB =  $conn2->query($sqlB)->fetch_all();
?>
thg 8 29, 2017 1:19 SA

cảm ơn Dương nhiều nhé!

Đã trả lời thg 8 28, 2017 8:25 SA
+1
  • Nhìn qua code và phần view của bạn mình thấy bạn đang gặp khó khăn trong việc lấy (EXT, IP) từ DB A để gán vào truy vấn của DB B đúng không? :slight_smile:
  • Có lẽ bạn không thạo frontend thì theo mình đây là cách dễ nhất đối với bạn bây giờ:
    • Bạn bắt sự kiện khi change 1 trong 3 cái dropdown. Sau đó redirect tới URL với các query string tương ứng với giá trị 3 cái dropdown đó (đây chính là kết quả câu truy vấn 1).
    • Tại trang PHP của bạn. Bạn bắt các kết quả câu truy vấn 1 đó qua $_GET và gán nó vào câu truy vấn tới DB B. Bạn thử xem nhé :slight_smile:
Chia sẻ
thg 8 28, 2017 9:03 SA

ok thanks @KmasterYC , nhưng dropdown của mình sau này có nhiều option lắm, mà gán tay kiểu đó chắc sẽ bị nhầm.

Avatar Tong Hoa @hoaitvn
thg 9 20, 2017 3:22 SA

Bạn dùng cakephp framework, nó hỗ trợ query nhiều database khác nhau đấy.

Avatar Tường Vi @hoanglong85
thg 9 25, 2018 8:30 SA

Không biết bạn giải quyết được vấn đề chưa nhưng mình vẫn chia sẻ 1 class để kết nối mysql rất hay mà mình vẫn đang sử dụng cho code của mình. Vì mình cũng như bạn, cũng tự mầy mò thôi nên mình thấy cái này rất dễ dùng mà lại cực kỳ mạnh mẽ, các câu truy cấp rất dễ hiểu và linh hoạt. Link dưới là mình trỏ luôn đến cái đoạn mà bạn kết nối nhiều database. https://github.com/ThingEngineer/PHP-MySQLi-Database-Class#multiple-database-connection

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí