2011-04-05 4 views
0

테이블의 열을 업데이트해야하는 MySQL의 저장 프로 시저가 있습니다. 실행시PHP에서 MySQL 저장 프로 시저 호출은 한 행만 업데이트합니다.

CALL recalculate_city_ids(); 

프롬프트에서 정확한 수의 행이 업데이트됩니다 (수 백 개). PHP에서 명령을 실행하면 단 한 행만 업데이트되고 오류가 발생하지 않습니다.

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

그리고 sproc에 대한 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입니다. 또한 PHP (오류 없음)에서 저장 프로 시저를 만들 수 없으며 MySQL 프롬프트에서도이 부분을 수행해야했습니다.

PHP와 MySQL 프롬프트에서 동일한 사용자 이름을 사용하고 있습니다.

+0

왜이 기능이 작동하지 않겠지 만 SELECT 및 UPDATE에 대해서만 SQL을 사용하여 PHP로 작성 될 수 있습니다. –

+0

아마도 "updated : $ result"를 인쇄하고 있습니까? 그러면 "1"이 인쇄됩니다. 나는 타임 스탬프가 업데이트되고 적절한 행이 업데이트 된 테이블에서 SP의 트리밍 된 버전으로 빠른 테스트를 실행했습니다. – jesse

+0

업데이트해야 할 수천 개의 행이있을 수 있으므로 성능상의 이유로 DB에 보관하는 것이 좋습니다. 아무 것도 인쇄하지 않습니다. MySQL에서 효과를 확인하기 만하면 단일 행이 업데이트 된 것을 볼 수 있습니다. – Devin

답변

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;

에 반환 된 세트를 제거하면 문제가 해결되었습니다.

관련 문제