PHP 5.3.1 ile referans sorun geçmek

8 Cevap reference

Tamam, bu ben açıklayacağım kadar lütfen bana ayı, bir garip bir sorundur.

Biz 5.3.1 PHP 5.2.5 ve bizim dev sunucuları yükseltti.

Anahtarından sonra bizim kodunu kadar yükleme, bizim gibi hataları başlar:

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in /home/spot/trunk/system/core/Database.class.php on line 105

aşağıdaki gibi (105) bahsedilen hat:

call_user_func_array(Array($stmt, 'bind_param'), $passArray);

biz aşağıdaki satırı değiştirildi:

call_user_func_array(Array($stmt, 'bind_param'), &$passArray);

(allow_call_time_pass_reference çünkü) kapalıysa, bu noktada, php bu atar:

Deprecated: Call-time pass-by-reference has been deprecated in /home/spot/trunk/system/core/Database.class.php on line 105

Bir süre bu düzeltmek için denedikten sonra, ben bozuldu ve allow_call_time_pass_reference üzerinde ayarlanır.

İşte Deprecated uyarı kurtuldum, ama şimdi Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference uyarı with or without başvuru, her zaman atıyor.

Bunu düzeltmek için ne kadar sıfır ipucu var. Hedef yöntem benim kendi olsaydı, ben sadece işlev bildiriminde gelen değişkenler başvurur, ancak (nispeten) yerli yöntemi (mysqli) bulunuyor.

Herkes bu yaşanmıştır? Nasıl etrafında alabilirsiniz?

Teşekkür ederim.

8 Cevap

Sen elemanları ($ passArray) bir dizi geçiyoruz. Bu gerçekten sen işlevine geçirmeden öğelerin listesi beri ikinci öğe inside geçti dizisi, bir referans olması gerekir.

Ben sadece call_user_func_array yoluyla bind_param çağırıyor ve parametreleri bir dizi geçirerek, bu aynı sorunu yaşadı. Çözelti başvurulacak dizideki değerleri değiştirmek için. Bu zarif değil ama işe yarıyor.

call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($passArray));

function makeValuesReferenced($arr){
    $refs = array();
    foreach($arr as $key => $value)
        $refs[$key] = &$arr[$key];
    return $refs;

}

Aslında, referansları ve tüm fonksiyonları call aile ile ilgili PHP 5.3.1 ile bir hata olduğunu unutmayın:

PHP Bugs #50394: Reference argument converted to value in __call

Gördüğünüz davranışı, bu hata sonucu ve uzun vadede sorunlara neden olabilir bilge bunu kodu düzeltmek için herhangi bir girişim olabilir.

Sorun PHP SVN sürümü sabit olmuştur. 5.3.2 serbest bırakılana kadar, kullanmak için yeni bir sürümünü derlemek, ya da bir önceki sürüme geri olabilir.

Biz bu kod ile aynı sorunu yaşadığını:

call_user_func(array($strCartHandler, 'CartPurchaseEvent'), $strCartEvent, $objToUser, null, $this);

Benim çözüm sadece call_user_func tamamen atlayın ve bunun için oldu:

$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);

Ben ne önerilmemektedir bir fonksiyonu sayesinde bir başvuru geçirmeden olduğunu düşünüyorum. Işlev tanımında gibi bir şey yapın:

function(&$arg) {

}

Bu size çok yardımcı olmaz ama muhtemelen yine başvuru geçmesi gerekmez. Ben bir sarıcı işlevi deneyebilirsiniz sanırım.

function wrapper($stmt, &$passArray) {
    call_user_func_array($stmt, $passArray);
}

Ben mysqli_bind_param() ve mysqli_bind_result() fonksiyonları kullanmak için çok zor olduğunu düşünüyorum. Sana call_user_func_array() ile birlikte bunları kullanarak tanımlamaktadır olarak aynı zorluklarla karşılaştıkları ettik

Benim çözüm mysqli kullanarak durdurmak ve yerine PDO_MYSQL kullanımı idi. Bu çok kolay bir kullanıma sahiptir:

$pdoStmt->execute( $passArray );

Bu irade olur:

<?php
call_user_func_array(Array($stmt, 'bind_param'), array(&$passArray));

function bind_param ($val)
{
    $val = (is_array($val)) ? $val[0] : $val;

    // operations...
}

?>

İkinci paramer bir dizi olmalı. görünüşe göre bu sadece 5.3 yılında yürürlüğe girmiştir