ฉันตระหนักดีว่าเป็นเวลานานแล้วที่มีกิจกรรมใหม่เกี่ยวกับคำถามนี้ แต่ตามที่ผู้โพสต์รายอื่นแสดงความคิดเห็น - get_result()
ขณะนี้มีให้ใช้งานใน PHP เท่านั้นโดยการติดตั้งไดรเวอร์ MySQL เนทีฟ (mysqlnd) และในบางกรณีอาจเป็นไปไม่ได้หรือไม่พึงปรารถนาที่จะติดตั้ง mysqlnd ดังนั้นผมคิดว่ามันจะเป็นประโยชน์ในการโพสต์คำตอบนี้มีข้อมูลเกี่ยวกับวิธีการได้รับฟังก์ชันการทำงานที่get_result()
ข้อเสนอ - get_result()
โดยไม่ต้องใช้
get_result()
คือ / มักจะรวมเข้ากับfetch_array()
เพื่อวนซ้ำชุดผลลัพธ์และเก็บค่าจากแต่ละแถวของผลลัพธ์ที่ตั้งค่าไว้ในอาร์เรย์ที่จัดทำดัชนีเป็นตัวเลขหรือเชื่อมโยง ตัวอย่างเช่นโค้ดด้านล่างใช้ get_result () กับ fetch_array () เพื่อวนซ้ำชุดผลลัพธ์โดยจัดเก็บค่าจากแต่ละแถวในอาร์เรย์ $ data [] ที่จัดทำดัชนีด้วยตัวเลข:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$result = $stmt->get_result();
while($data = $result->fetch_array(MYSQLI_NUM)) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
แต่ถ้าget_result()
ไม่สามารถใช้ได้ (เพราะ mysqlnd ไม่ได้ติดตั้ง) get_result()
จากนั้นนำไปสู่การนี้การแก้ไขปัญหาของวิธีการจัดเก็บค่าจากแถวของชุดผลลัพธ์ในแต่ละอาร์เรย์โดยไม่ต้องใช้ หรือวิธีย้ายรหัสเดิมที่ใช้get_result()
ในการรันโดยไม่มีรหัส (เช่นใช้bind_result()
แทน) - ในขณะที่ส่งผลกระทบต่อส่วนที่เหลือของโค้ดให้น้อยที่สุด
bind_result()
แต่กลับกลายเป็นว่าการจัดเก็บค่าจากแต่ละแถวในอาร์เรย์ตัวเลขจัดทำดัชนีไม่เป็นเช่นนั้นตรงไปข้างหน้าโดยใช้ bind_result()
คาดว่ารายการตัวแปรสเกลาร์ (ไม่ใช่อาร์เรย์) ดังนั้นจึงต้องใช้เวลาในการจัดเก็บค่าจากแต่ละแถวของผลลัพธ์ที่ตั้งไว้ในอาร์เรย์
แน่นอนว่าโค้ดสามารถแก้ไขได้ง่ายๆดังนี้:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
แต่สิ่งนี้กำหนดให้เราต้องแสดงรายการ $ data [0], $ data [1] ฯลฯ ทีละรายการอย่างชัดเจนในการโทรbind_result()
ซึ่งไม่เหมาะอย่างยิ่ง เราต้องการโซลูชันที่ไม่ต้องการให้เราต้องแสดงรายการ $ data [0], $ data [1], ... $ data [N-1] อย่างชัดเจน (โดยที่ N คือจำนวนฟิลด์ในคำสั่ง select) bind_results()
ในการเรียกร้องให้ หากเรากำลังโอนย้ายแอปพลิเคชันเดิมที่มีข้อความค้นหาจำนวนมากและแต่ละคำค้นหาอาจมีฟิลด์จำนวนแตกต่างกันในส่วนselect
คำสั่งการย้ายข้อมูลจะใช้แรงงานมากและมีแนวโน้มที่จะเกิดข้อผิดพลาดหากเราใช้วิธีแก้ปัญหาเช่นเดียวกับด้านบน .
ตามหลักการแล้วเราต้องการข้อมูลโค้ด 'drop-in replacement' - เพื่อแทนที่เฉพาะบรรทัดที่มีget_result()
ฟังก์ชันและ while () วนซ้ำในบรรทัดถัดไป รหัสแทนที่ควรมีฟังก์ชันเดียวกับโค้ดที่ถูกแทนที่โดยไม่มีผลกับบรรทัดใด ๆ ก่อนหน้าหรือบรรทัดใด ๆ หลังจากนั้นรวมถึงบรรทัดภายในลูป while () ตามหลักการแล้วเราต้องการให้รหัสแทนที่มีขนาดกะทัดรัดที่สุดเท่าที่จะเป็นไปได้และเราไม่ต้องการที่จะต้องเทย์เลอร์รหัสแทนที่ตามจำนวนฟิลด์ในselect
ประโยคของข้อความค้นหา
ค้นหาบนอินเทอร์เน็ตฉันพบโซลูชันจำนวนหนึ่งที่ใช้bind_param()
กับcall_user_func_array()
(ตัวอย่างเช่นผูกพารามิเตอร์ mysqli_stmt แบบไดนามิกแล้วผูกผลลัพธ์ (PHP) ) แต่โซลูชันส่วนใหญ่ที่ฉันพบในที่สุดนำไปสู่ผลลัพธ์ที่ถูกเก็บไว้ในอาร์เรย์ที่เชื่อมโยงไม่ใช่ อาร์เรย์ที่จัดทำดัชนีเป็นตัวเลขและโซลูชันเหล่านี้จำนวนมากไม่กะทัดรัดเท่าที่ฉันต้องการและ / หรือไม่เหมาะกับ 'การแทนที่แบบดรอปอิน' อย่างไรก็ตามจากตัวอย่างที่ฉันพบฉันสามารถรวบรวมวิธีแก้ปัญหานี้ซึ่งเหมาะกับใบเรียกเก็บเงิน:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) {
$var = $i;
$$var = null;
$data[$var] = &$$var;
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
แน่นอนว่าลูป for () สามารถยุบเป็นบรรทัดเดียวเพื่อให้กระชับมากขึ้น
ฉันหวังว่านี้จะช่วยให้ทุกคนที่กำลังมองหาวิธีการแก้ปัญหาโดยใช้bind_result()
การจัดเก็บค่าจากแต่ละแถวในอาร์เรย์ตัวเลขจัดทำดัชนีและ / get_result()
หรือมองหาวิธีการโยกย้ายรหัสเดิมที่ใช้ ยินดีต้อนรับความคิดเห็น
$stmt = $conn->mysqli->stmt_init();
?