PHP PDO trả về hàng đơn


113

CẬP NHẬT 2:

Vì vậy, đây có phải là tối ưu hóa nhất mà nó có thể nhận được?

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

CẬP NHẬT 1:

Tôi biết tôi có thể thêm giới hạn cho truy vấn sql, nhưng tôi cũng muốn loại bỏ vòng lặp foreach, điều mà tôi không nên cần.

CÂU HỎI GỐC:

Tôi có tập lệnh sau đây là IMO tốt để trả về nhiều hàng từ cơ sở dữ liệu vì phần "foreach".

Làm cách nào để tối ưu hóa điều này, nếu tôi biết tôi sẽ luôn chỉ nhận được 1 hàng từ cơ sở dữ liệu. Nếu tôi biết tôi sẽ chỉ nhận được 1 hàng từ cơ sở dữ liệu, tôi không hiểu tại sao tôi cần vòng lặp foreach, nhưng tôi không biết cách thay đổi mã.

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetchAll();

foreach( $result as $row ) {
    echo $row["figure"];
}

$DBH = null;

2
$STH - $DBH -> prepare nên có $STH = $DBH -> preparemột số nơi trên trang này.
Rune

Bạn có thể sử dụng foreach khi nghỉ ngơi;
EgoistDeveloper

Câu trả lời:


206

Chỉ cần tìm nạp. chỉ nhận được một hàng. Vì vậy không cần vòng lặp foreach: D

$row  = $STH -> fetch();

ví dụ (ty northkildonan):

$dbh = new PDO(" --- connection string --- "); 
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); 
$stmt->execute(); 
$row = $stmt->fetch();

12
Được tối ưu hóa nhất nếu bạn sử dụng "LIMIT 1" trong câu lệnh chuẩn bị của mình.
mjspier

2
tuyệt vời, xin vui lòng đưa ra ví dụ đầy đủ. Không chỉ một dòng duy nhất phải đi đâu đó trong ví dụ trên.
andrebruton

3
@andrebruton $dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
low_rents

2
fetch(PDO::FETCH_ASSOC)sẽ cắt nửa mảng được trả về nếu bạn chỉ cần một mảng khóa-giá trị.
rybo111

Bạn có thực sự cần LIMIT 1mọi lúc không? Việc biết rằng bạn đang chọn một UNIQUEgiá trị sẽ xuất hiện trong tâm trí.
Super Cat

15
$DBH = new PDO( "connection string goes here" );
$STH - $DBH -> prepare( "select figure from table1 ORDER BY x LIMIT 1" );

$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];

$DBH = null;

Bạn có thể sử dụng tìm nạp và LIMIT cùng nhau. LIMIT có tác dụng là cơ sở dữ liệu chỉ trả về một mục nhập nên PHP phải xử lý rất ít dữ liệu. Với tìm nạp, bạn nhận được mục nhập kết quả đầu tiên (và duy nhất) từ phản hồi cơ sở dữ liệu.

Bạn có thể tối ưu hóa nhiều hơn bằng cách đặt loại tìm nạp, xem http://www.php.net/manual/de/pdostatement.fetch.php . Nếu bạn chỉ truy cập nó thông qua tên cột, bạn cần đánh số mảng.

Hãy lưu ý điều khoản ORDER. Sử dụng ORDER hoặc WHERE để lấy hàng cần thiết. Nếu không, bạn sẽ nhận được hàng đầu tiên trong bảng báo cáo thời gian.


13

Bạn đã thử chưa:

$DBH = new PDO( "connection string goes here" );
$row = $DBH->query( "select figure from table1" )->fetch();
echo $row["figure"];
$DBH = null;

4
Bạn thực sự có thể đi xa hơn và làm được $row = $DBH->query($query)->fetch()['figure']. Nếu fetchtrả về falsevì không có kết quả, PHP sẽ im lặng bỏ qua tham chiếu khóa không hợp lệ. Nếu có sự cố xảy ra query, tùy thuộc vào cách bạn đã thiết lập xử lý lỗi của mình, nó sẽ đưa ra một Ngoại lệ (mong muốn, theo ý kiến ​​của tôi) hoặc bạn sẽ gặp Invalid object method reference "fetch" on "false"....lỗi, một dạng mà bạn sẽ mắc phải vì truy vấn rõ ràng không thành công.
kael


8

Bạn có thể thử điều này cho một truy vấn CHỌN cơ sở dữ liệu dựa trên đầu vào của người dùng bằng cách sử dụng PDO:

$param = $_GET['username'];

$query=$dbh->prepare("SELECT secret FROM users WHERE username=:param");
$query->bindParam(':param', $param);
$query->execute();

$result = $query -> fetch();

print_r($result);

3
Tôi nghĩ rằng bạn đang có một ngày tồi tệ, hoặc bạn chỉ muốn làm nổi bật hồ sơ của bạn. Câu trả lời của tôi chứng thực với cùng một kịch bản bằng cách sử dụng một biến cho hàm SELECT với truy vấn PDO. Tôi sẽ xóa nhận xét tiêm sql khỏi câu trả lời của tôi chỉ để làm cho ngày của bạn (và của tôi).
user3162468

4

làm thế nào về việc sử dụng limit 0,1để tối ưu hóa mysql

và về mã của bạn:

$DBH = new PDO( "connection string goes here" );

$STH - $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH ->fetch(PDO::FETCH_ASSOC)

echo $result["figure"];

$DBH = null;

3

Cảm ơn gợi ý của Steven để sử dụng fetchColumn, đây là đề xuất của tôi để cắt ngắn một dòng khỏi mã của bạn.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.