2010-01-12 32 views
32

Ok, đây là một vấn đề lạ, vì vậy hãy chịu với tôi khi tôi giải thích.Vượt qua vấn đề tham chiếu với PHP 5.3.1

Chúng tôi đã nâng cấp máy chủ dev của mình từ PHP 5.2.5 lên 5.3.1.

tải lên mã của chúng tôi sau khi chuyển đổi, chúng tôi bắt đầu nhận được lỗi như:

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

dòng đề cập (105) như sau:

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

chúng tôi đã thay đổi dòng vào như sau:

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

tại thời điểm này (vì allow_call_time_pass_reference) bị tắt, php ném này:

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

Sau khi cố gắng khắc phục điều này trong một thời gian, tôi gục ngã và thiết lập allow_call_time_pass_reference để trên.

Điều đó đã loại bỏ cảnh báo Deprecated, nhưng hiện tại cảnh báo Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference được ném mỗi lần, có hoặc không có tham chiếu.

Tôi không có cách nào để sửa lỗi này. Nếu phương thức đích là của riêng tôi, tôi sẽ chỉ tham chiếu đến các vars đến trong khai báo func, nhưng đó là một phương thức native (tương đối) (mysqli).

Có ai đã trải nghiệm điều này không? Làm thế nào tôi có thể vượt qua nó?

Cảm ơn bạn.

+0

Ngoài ra, trong đoạn code trên $ stmt là một đối tượng trở về từ mysqli :: chuẩn bị – Spot

+1

Tôi cũng có vấn đề này và tìm thấy [này] (https://sixohthree.com/1486/migrating-to-php-5-3-call_user_func_array) bài đăng trên blog đã giúp tôi rất nhiều. – cb0

Trả lời

16

Bạn đang chuyển một mảng các phần tử ($ passArray). Mục thứ hai bên trong mảng đã qua cần phải là tham chiếu, vì đó thực sự là danh sách các mục bạn đang chuyển đến hàm.

+0

Thực ra bạn đã đúng. Tuy nhiên, tham khảo rằng var cũng không giúp được gì. Hmmmm – Spot

+4

Ok, đã sửa lỗi này bằng cách tạo mảng giả, tham chiếu các giá trị từ chính. Thật buồn khi điều này được yêu cầu phải trung thực. :) Cảm ơn! – Spot

+0

Thân mến Tôi có một vấn đề tương tự. Bạn có gợi ý nào không. http://stackoverflow.com/questions/23290490/mysqli-prepared-statements-error?noredirect=1#comment35651490_23290490 –

0

Tôi nghĩ rằng các chức năng mysqli_bind_param()mysqli_bind_result() rất khó xử dụng. Tôi đã gặp khó khăn tương tự như bạn mô tả khi sử dụng chúng kết hợp với call_user_func_array()

Giải pháp thay thế của tôi là ngừng sử dụng mysqli và thay vào đó sử dụng PDO_mysql. Nó có cách sử dụng dễ dàng hơn nhiều:

$pdoStmt->execute($passArray); 
+0

Tôi nghĩ PDO_mysql không được chấp nhận? – Spot

+0

Không, không hề. Điều gì trên thế giới đã cho bạn ý tưởng đó? –

+0

@Spot: 'php_mysql.so' không được khuyến nghị (không được chấp nhận),' pdo_mysql.so' được đề xuất rất nhiều. –

-1

Nhân tố phụ thứ hai Phải là một mảng. dường như điều này chỉ được thực thi trong 5.3

+0

một mảng. – Spot

+0

có gì trong mảng đó? – DeveloperChris

2

Tôi nghĩ điều không được chấp nhận là chuyển một tham chiếu thông qua một hàm. Trong định nghĩa chức năng bạn làm điều gì đó như:

function(&$arg) { 

} 

Điều này không giúp bạn nhiều nhưng có thể bạn không cần phải chuyển tham chiếu. Tôi đoán bạn có thể thử một hàm wrapper.

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

Tôi vừa trải nghiệm cùng một vấn đề này, gọi bind_param qua call_user_func_array và chuyển một mảng tham số. Giải pháp là sửa đổi các giá trị trong mảng được tham chiếu. Nó không thanh lịch nhưng nó hoạt động.

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; 

} 
+2

bạn đã cứu mạng tôi – KennyPowers

6

Trên thực tế, ý thức được rằng có một lỗi với PHP 5.3.1 tài liệu tham khảo liên quan và tất cả call gia đình của các chức năng:

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

Các hành vi bạn đang nhìn thấy có thể là một kết quả của lỗi này và bất kỳ nỗ lực nào để sửa mã nó khôn ngoan có thể gây ra các vấn đề trong thời gian dài.

Sự cố đã được khắc phục trong phiên bản SVN của PHP. Cho đến khi 5.3.2 được phát hành, bạn có thể biên dịch một phiên bản mới để sử dụng hoặc hạ cấp xuống phiên bản cũ hơn.

3

Chúng tôi đã trải qua cùng một vấn đề này với mã này:

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

giải pháp của tôi là chỉ cần bỏ call_user_func hoàn toàn và thực hiện điều này:

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

Điều này sẽ giúp:

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

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

    // operations... 
} 

?> 
0

Tôi gặp sự cố tương tự, mã hiện tại không hoạt động:

$query="Select id,name FROM mytable LIMIT ?,?"; 
$params=Array('ii'); 
array_push($params,$from_var); 
array_push($params,$to_var); 
... 
$stmt=$link->prepare("$query"); 
$ref=new ReflectionClass('mysqli_stmt'); 
$method=$ref->getMethod("bind_param"); 
$method->invokeArgs($stmt,$params); 
... 

Nó nói rằng "Parameter 2 đến mysqli_stmt :: bind_param() dự kiến ​​sẽ là một tài liệu tham khảo, giá trị nhất định"

Và sau đó, trong tuyệt vọng, tôi đã cố gắng để lấy $ from_var và $ to_var trích dẫn. Va no đa hoạt động!

$params=Array('ii'); 
array_push($params,"$from_var"); 
array_push($params,"$to_var"); 

Hope, nó sẽ giúp ai đó, chúc may mắn :)

Các vấn đề liên quan