2010-02-22 36 views
7

Tôi đang chạy một truy vấn với một mysql thủ tục lưu trữ:Thủ tục lưu trữ gây ra "lệnh đồng bộ hóa" trên truy vấn tiếp theo

$AddProf_qr = mysql_query("call AddStudent('$d_Pass', '$d_Titl', '$d_Firs', '$d_Midd', '$d_Last', '$d_Addr', '$d_City', '$d_Stat', '$d_County', '$d_Zipc', $d_Gend, '$d_Birh', '$d_Phom', '$d_Phoh', '$d_Phoo', '$d_Email', '$d_Webs', '$d_Natn', '$d_Profsn', '$d_Compny', '$d_Desig', $d_ProfAcc)", $this->c_remote) or die ("first call" . mysql_error($this->c_remote)); 

Tôi đang trù được chỉ là một kết quả từ cuộc gọi: @@ IDENTITY = một số;

$AP_result = mysql_fetch_array($AddProf_qr); 
$CurrentSID = $AP_result['@@IDENTITY']; 

hoạt động tốt. nhưng khi tôi chạy một truy vấn cập nhật mysql khác ngay sau này, nó đưa ra một lỗi nói:

Lỗi: 2014 (CR_COMMANDS_OUT_OF_SYNC) Thông báo: Lệnh không đồng bộ; bạn không thể chạy lệnh này ngay bây giờ

tôi đã cố gắng chèn:

mysql_free_result($AddProf_qr); 

nhưng vẫn như nhau.

Cuộc gọi MySQL cũng thực thi tốt phần còn lại của tập lệnh chạy mà không có sự cố nào ở trên được nhận xét. nhưng chúng không chạy cùng một lúc. Dự đoán tốt nhất của tôi là, cuộc gọi đang làm điều gì đó đang làm rối tung điều này.

+0

Chuyển sang tùy chọn mysqli hoặc PDO? – VolkerK

+0

Tôi có toàn bộ tập lệnh được viết bằng mysql (một số truy vấn). Tôi đã hy vọng nếu ai đó biết điều này là gì, trước khi tôi viết lại nó. – DMin

+3

mysql() là một đống crap và không được chấp nhận – hobodave

Trả lời

8

Quy trình được lưu trữ của bạn đang trả lại nhiều kết quả. Xem this post

Giải pháp?

  • Sử dụng mysqli_multi_query
  • Dừng sử dụng thư viện mysql cổ - i trong mysqli viết tắt của "Cải thiện" - với lý do chính đáng.
+0

mysqli không khắc phục vấn đề này, nhưng câu trả lời là rất hữu ích dù sao :-) – Richard

0

Kiểm tra tại đây: http://us3.php.net/manual/en/function.mysql-query.php Trong nhận xét, một người cho rằng anh ấy đã làm cho nó hoạt động bằng cách đặt cờ kết nối thành MYSQL_MULTI_RESULTS (131072).

Nhưng nó sẽ là tốt hơn để sử dụng mysqli ...

+0

okay, giải quyết nó. không phải là giải pháp tốt nhất trên thế giới nhưng miễn là nó hoạt động, tôi hạnh phúc. Đó là truy vấn đầu tiên trong kịch bản của tôi. tôi đã tạo kết nối tới db, chạy truy vấn. đóng kết nối. tạo một kết nối mới và chạy phần còn lại của tập lệnh. :) – DMin

2

@DMin Có đó là sẽ làm việc, nhưng bạn sẽ sụp đổ server sớm hay muộn. Chỉ cần thực hiện các phép toán, một trong những resquest đến một trang mà làm cho 3 * số thủ tục cơ sở dữ liệu! Hãy nghĩ về điều đó!

[UPDATE] Giải pháp:

$aCategory = array(); 
$it=0; 
$res = $mysqli->multi_query("call ListCategory();"); 
if($res) { 
    do { 
    if ($result = $mysqli->store_result()) { 

     while($row = $result->fetch_row()) { 
       $aCategory[$it] =$row; 
       $it= $it + 1; 
     } 
     $result->close(); 
    } 
    } while($mysqli->next_result()); 
} 

foreach($aCategory as $row){ 
    echo . $row[0] . " - " . $row[1] . "<br />"; 
} 

Chỉ muốn thêm rằng bạn đã sẵn sàng để gọi định kỳ tiếp theo.

PS: Bằng cách này, tôi không thể sử dụng

echo $aCategory['category_id'] ; 
//or 
echo $aCategory->category_id; 
//just 
echo $aCategory[0] 
0

mysql_free_result (khách hàng-> res);

while (mysql_more_results(client->conn)) 
{ 
    mysql_next_result(client->conn); 
} 

này đã làm sự quyến rũ đối với tôi :)

0

bộ kết quả trở về từ một thủ tục lưu trữ không thể được lấy một cách chính xác bằng mysqli_query(). Hàm mysqli_query() kết hợp việc thực hiện câu lệnh và tìm nạp tập kết quả đầu tiên thành một tập kết quả đệm, nếu có. Tuy nhiên, có các bộ kết quả thủ tục lưu trữ bổ sung bị ẩn khỏi người dùng gây ra mysqli_query() để không trả về bộ kết quả mong đợi của người dùng.

Các bộ kết quả được trả lại từ một thủ tục được lưu trữ được tìm nạp bằng cách sử dụng mysqli_real_query() hoặc mysqli_multi_query(). Cả hai hàm cho phép tìm nạp bất kỳ số lượng tập hợp kết quả nào được trả về bởi một câu lệnh, chẳng hạn như CALL.

xem official manual

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