PHP PDO mengembalikan satu baris


113

UPDATE 2:

Jadi, apakah ini yang paling optimal?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

UPDATE 1:

Saya tahu saya bisa menambahkan batas ke kueri sql, tetapi saya juga ingin menyingkirkan perulangan foreach, yang seharusnya tidak saya perlukan.

PERTANYAAN ASLI:

Saya memiliki skrip berikut yang merupakan IMO yang baik untuk mengembalikan banyak baris dari database karena bagian "foreach".

Bagaimana cara mengoptimalkan ini, jika saya tahu saya hanya akan selalu mendapatkan 1 baris dari database. Jika saya tahu saya hanya akan mendapatkan 1 baris dari database, saya tidak mengerti mengapa saya membutuhkan loop foreach, tetapi saya tidak tahu bagaimana mengubah kodenya.

$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 harus ada $STH = $DBH -> preparebeberapa tempat di halaman ini.
Rune

Anda bisa menggunakan foreach saat istirahat;
EgoistDeveloper

Jawaban:


206

Ambil saja. hanya mendapat satu baris. Jadi tidak diperlukan perulangan foreach: D

$row  = $STH -> fetch();

contoh (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
Paling optimal jika Anda menggunakan "LIMIT 1" dalam laporan persiapan Anda.
mjspier

2
luar biasa, tolong beri contoh lengkap. Bukan hanya satu baris yang harus mengarah ke suatu tempat dalam contoh di atas.
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();
lowrents

2
fetch(PDO::FETCH_ASSOC)akan memotong dua array yang dikembalikan jika Anda hanya membutuhkan array nilai kunci.
rybo111

Apakah Anda benar-benar membutuhkannya LIMIT 1setiap saat? Mengetahui bahwa Anda sedang memilih UNIQUEnilai muncul di benak Anda.
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;

Anda dapat menggunakan fetch dan LIMIT secara bersamaan. LIMIT memiliki efek bahwa database hanya mengembalikan satu entri sehingga PHP harus menangani data yang sangat sedikit. Dengan mengambil Anda mendapatkan entri hasil pertama (dan satu-satunya) dari tanggapan database.

Anda dapat melakukan lebih banyak pengoptimalan dengan mengatur jenis pengambilan, lihat http://www.php.net/manual/de/pdostatement.fetch.php . Jika Anda mengaksesnya hanya melalui nama kolom Anda perlu array bernomor.

Perhatikan klausul ORDER. Gunakan ORDER atau WHERE untuk mendapatkan baris yang dibutuhkan. Jika tidak, Anda akan mendapatkan baris pertama di tabel sepanjang waktu.


13

Apakah Anda mencoba:

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

4
Anda sebenarnya bisa melangkah lebih jauh dan melakukannya $row = $DBH->query($query)->fetch()['figure']. Jika fetchdikembalikan falsekarena tidak ada hasil, PHP diam-diam akan mengabaikan referensi kunci yang tidak valid. Jika ada yang salah query, tergantung pada bagaimana Anda menyiapkan penanganan kesalahan, itu akan memunculkan Pengecualian (diinginkan, menurut saya) atau Anda akan mendapatkan Invalid object method reference "fetch" on "false"....kesalahan, bentuk yang akan Anda dapatkan karena pertanyaannya jelas gagal.
kael


8

Anda dapat mencoba ini untuk kueri SELECT database berdasarkan input pengguna menggunakan 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
Saya pikir Anda hanya mengalami hari yang buruk bro, atau Anda hanya ingin menonjolkan profil Anda. Jawaban saya menguatkan skenario yang sama menggunakan variabel untuk fungsi SELECT dengan query PDO. Saya akan menghapus komentar sql injection dari jawaban saya hanya untuk membuat hari Anda (dan milik saya).
pengguna3162468

4

bagaimana kalau digunakan limit 0,1untuk optimasi mysql

dan tentang kode Anda:

$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

Terima kasih atas saran Steven untuk menggunakan fetchColumn, inilah rekomendasi saya untuk mempersingkat satu baris dari kode Anda.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.