PHP PDO ส่งคืนแถวเดียว


113

อัปเดต 2:

นี่เป็นวิธีที่ดีที่สุดที่จะได้รับหรือไม่?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

อัปเดต 1:

ฉันรู้ว่าฉันสามารถเพิ่มขีด จำกัด ให้กับแบบสอบถาม sql ได้ แต่ฉันก็ต้องการกำจัด foreach loop ซึ่งฉันไม่ควรต้องการ

คำถามเดิม:

ฉันมีสคริปต์ต่อไปนี้ซึ่งเป็น IMO ที่ดีสำหรับการส่งคืนแถวจำนวนมากจากฐานข้อมูลเนื่องจากส่วน "foreach"

ฉันจะปรับให้เหมาะสมได้อย่างไรถ้าฉันรู้ว่าฉันจะได้รับ 1 แถวจากฐานข้อมูลเสมอ ถ้าฉันรู้ว่าฉันจะได้รับ 1 แถวจากฐานข้อมูลเท่านั้นฉันไม่เห็นว่าทำไมฉันถึงต้องการ foreach loop แต่ฉันไม่รู้วิธีเปลี่ยนรหัส

$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 -> prepareหลายที่ในหน้านี้
Rune

คุณสามารถใช้ foreach ในช่วงพัก;
EgoistDeveloper

คำตอบ:


206

เพียงแค่ดึงข้อมูล ได้รับเพียงหนึ่งแถว ดังนั้นไม่จำเป็นต้องใช้ foreach loop: D

$row  = $STH -> fetch();

ตัวอย่าง (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
เหมาะที่สุดหากคุณใช้ "LIMIT 1" ในใบแจ้งยอดเตรียม
mjspier

2
โปรดยกตัวอย่างที่สมบูรณ์ ไม่ใช่แค่บรรทัดเดียวที่ต้องไปที่ไหนสักแห่งในตัวอย่างด้านบน
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)จะตัดอาร์เรย์ที่ส่งคืนครึ่งหนึ่งหากคุณต้องการเพียงอาร์เรย์คีย์ - ค่า
rybo111

คุณต้องการLIMIT 1ตลอดเวลาจริงๆหรือ? การรู้ว่าคุณกำลังเลือกUNIQUEคุณค่าอยู่ในใจ
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;

คุณสามารถใช้การดึงข้อมูลและ LIMIT ร่วมกันได้ LIMIT มีผลทำให้ฐานข้อมูลส่งกลับรายการเดียวดังนั้น PHP จึงต้องจัดการข้อมูลน้อยลงมาก ด้วยการดึงข้อมูลคุณจะได้รับรายการผลลัพธ์แรก (และเท่านั้น) จากการตอบกลับฐานข้อมูล

คุณสามารถทำอะไรได้มากกว่าการเพิ่มประสิทธิภาพโดยการตั้งค่าประเภทเรียกดูhttp://www.php.net/manual/de/pdostatement.fetch.php หากคุณเข้าถึงผ่านชื่อคอลัมน์เท่านั้นคุณต้องใช้อาร์เรย์ที่มีหมายเลข

ระวังคำสั่ง ORDER ใช้ ORDER หรือ WHERE เพื่อรับแถวที่ต้องการ มิฉะนั้นคุณจะได้แถวแรกในตารางตามเวลา


13

คุณลอง:

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

4
$row = $DBH->query($query)->fetch()['figure']คุณจริงจะไปต่อไปและทำ หากfetchส่งคืนfalseเนื่องจากไม่มีผลลัพธ์ PHP จะเพิกเฉยต่อการอ้างอิงคีย์ที่ไม่ถูกต้อง หากมีบางอย่างผิดพลาดqueryขึ้นอยู่กับว่าคุณได้ตั้งค่าการจัดการข้อผิดพลาดอย่างไรมันอาจส่งข้อยกเว้น (ต้องการในความคิดของฉัน) หรือคุณจะได้รับInvalid object method reference "fetch" on "false"....ข้อผิดพลาดซึ่งเป็นรูปแบบที่คุณจะได้รับอยู่ดีเพราะ การค้นหาล้มเหลวอย่างเห็นได้ชัด
kael


8

คุณสามารถลองสิ่งนี้สำหรับแบบสอบถาม SELECT ฐานข้อมูลตามข้อมูลของผู้ใช้โดยใช้ 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
ฉันคิดว่าคุณแค่มีวันที่แย่ ๆ หรือแค่อยากให้โปรไฟล์ของคุณโดดเด่น คำตอบของฉันยืนยันกับสถานการณ์เดียวกันโดยใช้ตัวแปรสำหรับฟังก์ชัน SELECT ด้วยแบบสอบถาม PDO ฉันจะลบความคิดเห็นการฉีด sql จากคำตอบของฉันเพียงเพื่อให้วันของคุณ (และของฉัน)
user3162468

4

วิธีการใช้limit 0,1สำหรับการเพิ่มประสิทธิภาพ mysql

และเกี่ยวกับรหัสของคุณ:

$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 ในการใช้ fetchColumn นี่คือคำแนะนำของฉันในการตัดทอนหนึ่งบรรทัดออกจากโค้ดของคุณ

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.