PHP PDO tek satır döndürüyor


113

GÜNCELLEME 2:

Peki alabileceği en optimize edilmiş şey bu mu?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

GÜNCELLEME 1:

Sql sorgusuna limit ekleyebileceğimi biliyorum ama aynı zamanda ihtiyacım olmayan foreach döngüsünden de kurtulmak istiyorum.

ORİJİNAL SORU:

"Foreach" bölümü nedeniyle veritabanından birçok satırı döndürmek için iyi bir IMO olan aşağıdaki betiğe sahibim.

Veritabanından her zaman sadece 1 satır alacağımı bilirsem, bunu nasıl optimize ederim. Veritabanından yalnızca 1 satır alacağımı biliyorsam, neden foreach döngüsüne ihtiyacım olduğunu anlamıyorum, ancak kodu nasıl değiştireceğimi bilmiyorum.

$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$STH = $DBH -> preparebu sayfada birkaç yer olmalıdır .
Rune

Foreach'i molada
EgoistDeveloper

Yanıtlar:


206

Sadece getir. yalnızca bir satır alır. Yani foreach döngüsüne gerek yok: D

$row  = $STH -> fetch();

örnek (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
Hazırlama ifadenizde "LIMIT 1" kullanırsanız en çok optimize edilir.
mjspier

2
mükemmel, lütfen eksiksiz bir örnek verin. Yukarıdaki örnekte bir yere gitmesi gereken tek bir satır değil.
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)yalnızca bir anahtar-değer dizisine ihtiyacınız varsa, döndürülen diziyi ikiye böler.
rybo111

LIMIT 1Yine de her zaman ihtiyacın var mı? Bir UNIQUEdeğer seçtiğinizi bilmek akla geliyor.
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;

Getirme ve LIMIT öğesini birlikte kullanabilirsiniz. LIMIT, veritabanının yalnızca bir girdi döndürme etkisine sahiptir, bu nedenle PHP çok daha az veri işlemelidir. Getirme ile veritabanı yanıtından ilk (ve tek) sonuç girişini alırsınız.

Getirme türünü ayarlayarak daha fazla optimizasyon yapabilirsiniz, bkz. Http://www.php.net/manual/de/pdostatement.fetch.php . Buna yalnızca sütun isimleriyle erişirseniz, numaralandırılmış diziye ihtiyacınız vardır.

SİPARİŞ hükmüne dikkat edin. Gerekli satırı almak için SİPARİŞ veya NEREDE kullanın. Aksi takdirde tablodaki ilk satırı alle alle.


13

Denedin mi:

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

4
Aslında daha ileri gidebilir ve yapabilirsiniz $row = $DBH->query($query)->fetch()['figure']. Eğer fetchdöner falsesonuç bulunmaması nedeniyle, PHP sessizce geçersiz anahtar referansı yok sayacak. Bir şeyler ters giderse query, hata işleme kurulumunuzu nasıl yaptırdığınıza bağlı olarak, ya bir İstisna atar (bence istenir) ya da bir Invalid object method reference "fetch" on "false"....hata alırsınız , bunun bir şekli zaten almış olursunuz çünkü sorgu açıkça başarısız oldu.
kael


8

Bunu, PDO kullanarak kullanıcı girdisine dayalı bir veritabanı SELECT sorgusu için deneyebilirsiniz:

$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
Sanırım kötü bir gün geçiriyorsun kardeşim, ya da sadece profilini öne çıkarmak istiyorsun. Cevabım, bir PDO sorgusuyla SELECT işlevi için bir değişken kullanarak aynı senaryoyu doğruluyor. Sql enjeksiyon yorumunu cevabımdan sadece senin gününü (ve benimkini) yapmak için sileceğim.
user3162468

4

limit 0,1mysql optimizasyonu için kullanmaya ne dersiniz

ve kodunuz hakkında:

$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

Steven'ın fetchColumn'u kullanma önerisi sayesinde, kodunuzdan bir satırı kısa kesmenizi öneriyorum.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.