2011-04-05 79 views
0

我在MySQL中有一個存儲過程,它應該更新表中的一列。當我運行在PHP中調用MySQL存儲過程只更新一行

CALL recalculate_city_ids(); 

從MySQL提示,正確的行數被更新(幾百)。當我從PHP運行命令時,只更新了一行,並且沒有發生錯誤。

這裏的PHP:

$con = mysqli_connect('localhost', 'user', 'pass', 'dbname'); 
$result = $con->query('call recalculate_city_ids()'); 
mysql_close($con); 

而且對於存儲過程的SQL:

DROP PROCEDURE IF EXISTS recalculate_city_ids; 
    DELIMITER $$ 
    CREATE PROCEDURE recalculate_city_ids() 
    READS SQL DATA 
    BEGIN 
     DECLARE o_id INT DEFAULT 0; 
     DECLARE o_latitude FLOAT; 
     DECLARE o_longitude FLOAT; 
     DECLARE done INT DEFAULT 0; 
     DECLARE cur_users CURSOR FOR SELECT id, latitude, longitude FROM user WHERE latitude IS NOT NULL ORDER BY fname; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 

     OPEN cur_users; 
     users: LOOP 
      FETCH cur_users INTO o_id, o_latitude, o_longitude; 

      IF done=1 THEN 
       LEAVE users; 
      END IF; 

      SELECT @closest_city_distance:=fn_distance_cosine(o_latitude, o_longitude, latitude, longitude) AS distance, @closest_city_id:=id AS id FROM category WHERE zone="city" AND active=1 ORDER BY distance LIMIT 1; 

      UPDATE user SET city_id = IF(@closest_city_distance<=30, @closest_city_id, 0) WHERE id=o_id; 
     END LOOP users; 
     CLOSE cur_users; 
    END 
    $$ 

我可以使用mysqli的運行從PHP其他查詢(也試過mysql的對象)。我也無法從PHP創建存儲過程(沒有錯誤),也不得不從MySQL提示符中執行該部分。

PHP和我的MySQL提示符使用相同的用戶名。

+0

我不知道爲什麼這不起作用,但它可以使用SQL編寫,只用於SELECT和UPDATE。 – 2011-04-05 23:44:56

+0

你可能打印「更新:$結果」?這將打印一個「1」。我做了一個快速測試,在時間戳正在更新並且正確的行已更新的表上,對錶格中的SP進行了精簡版測試。 – jesse 2011-04-06 00:07:57

+0

出於性能原因,我寧願將它放在數據庫中,因爲它可能需要更新數千行。 我不打印任何東西。只需檢查MySQL中的效果,這是我看到單行更新的地方。 – Devin 2011-04-06 01:21:43

回答

0

我認爲PHP在查詢返回多個結果集時不喜歡它。我並不真的需要返回任何事情,因爲這僅僅是一個榮耀UPDATE聲明,所以我改變了我的

SELECT @closest_city_distance:=fn_distance_cosine...查詢

SELECT fn_distance_cosine(o_latitude, o_longitude, latitude, longitude) as distance,id into closest_city_distance, closest_city_id FROM category WHERE zone="city" AND active=1 ORDER BY distance LIMIT 1;

因爲那是漸漸返回的結果集的唯一的地方,消除返回的集合解決了問題。