Bu soruyla ilgili yeni bir faaliyetin olmasının üzerinden epey zaman geçtiğinin farkındayım. Ancak, diğer yazarların da belirttiği gibi - get_result()
artık sadece MySQL yerel sürücüsünü (mysqlnd) yükleyerek PHP'de mevcut ve bazı durumlarda mysqlnd kurmak mümkün veya istenmeyebilir. Yani, bundan böyle işlevselliğini olsun nasıl bilgi ile bu cevabı göndermek için yararlı olacağını düşündüm get_result()
kullanmadan - teklifler get_result()
.
get_result()
genellikle fetch_array()
bir sonuç kümesinde döngü yapmak ve sonuç kümesinin her satırındaki değerleri sayısal olarak dizinlenmiş veya ilişkilendirilebilir bir dizide depolamak için ile birleştirilmiştir. Örneğin, aşağıdaki kod, bir sonuç kümesi boyunca döngü yapmak için get_result () işlevini kullanarak fetch_array () kullanır ve sayısal olarak dizine alınmış $ data [] dizisindeki her satırdaki değerleri depolar:
$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";
}
Bununla birlikte, get_result()
mevcut değilse (çünkü mysqlnd kurulu değildir), bu, bir sonuç kümesinin her bir satırındaki değerlerin kullanılmadan bir dizide nasıl saklanacağı sorununa yol açar get_result()
. Veya, get_result()
onsuz çalıştırmak için kullanan eski kodun nasıl taşınacağı (ör.bind_result()
geri kalanını olabildiğince az etkilerken, Bunun yerine ).
Her satırdaki değerleri sayısal olarak indekslenmiş bir dizide saklamanın kullanımının o kadar kolay olmadığı ortaya çıktı bind_result()
. bind_result()
skaler değişkenlerin bir listesini bekler (bir dizi değil). Bu nedenle, sonuç kümesinin her satırındaki değerleri bir dizide saklamak için biraz şey yapmak gerekir.
Elbette, kod aşağıdaki gibi kolayca değiştirilebilir:
$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";
}
Ancak bu, çağrıda $ data [0], $ data [1], vs.'yi ayrı ayrı listelememizi gerektirir bind_result()
ki bu ideal değildir. $ Data [0], $ data [1], ... $ data [N-1] (burada N, select ifadesindeki alanların sayısıdır) açıkça listelememizi gerektirmeyen bir çözüm istiyoruz görüşmede bind_results()
. Çok sayıda sorgusu olan eski bir uygulamayı taşıyorsak ve her sorgu select
cümlecikte farklı sayıda alan içeriyorsa , geçiş çok yoğun iş gücü gerektirir ve yukarıdaki gibi bir çözüm kullanırsak hataya meyillidir. .
İdeal olarak, sadece get_result()
işlevi içeren satırı ve sonraki satırdaki while () döngüsünü değiştirmek için bir 'drop-in değiştirme' kod parçacığı istiyoruz . Değiştirilen kod, while () döngüsünün içindeki satırlar da dahil olmak üzere önceki veya sonraki satırlardan herhangi birini etkilemeden değiştirdiği kodla aynı işleve sahip olmalıdır. İdeal olarak, değiştirme kodunun olabildiğince kompakt olmasını istiyoruz ve değiştirme kodunu select
, sorgunun cümlesindeki alanların sayısına bağlı olarak karşılamak zorunda kalmak istemiyoruz .
İnternette arama yaparken, bind_param()
birlikte kullanılan bir dizi çözüm buldum call_user_func_array()
(örneğin, dinamik olarak mysqli_stmt parametrelerini bağla ve ardından sonucu bağla (PHP) ), ancak bulduğum çoğu çözüm sonuçların sonuçların ilişkilendirilebilir bir dizide depolanmasına yol açtığını değil sayısal olarak indekslenmiş bir dizi ve bu çözümlerin çoğu benim istediğim kadar kompakt değildi ve / veya 'drop-in değişimleri' kadar uygun değildi. Ancak bulduğum örneklerden, faturaya uyan bu çözümü bir araya getirmeyi başardım:
$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";
}
Elbette, for () döngüsü daha kompakt hale getirmek için tek bir satıra daraltılabilir.
Umarım bu bind_result()
, her satırdaki değerleri sayısal olarak indekslenmiş bir dizide depolamak için bir çözüm arayan ve / veya eski kodu kullanarak geçiş yapmanın bir yolunu arayan herkese yardımcı olur get_result()
. Yorumlar hoş geldiniz.
$stmt = $conn->mysqli->stmt_init();
?