테이블의 열을 업데이트해야하는 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 프롬프트에서 동일한 사용자 이름을 사용하고 있습니다.
왜이 기능이 작동하지 않겠지 만 SELECT 및 UPDATE에 대해서만 SQL을 사용하여 PHP로 작성 될 수 있습니다. –
아마도 "updated : $ result"를 인쇄하고 있습니까? 그러면 "1"이 인쇄됩니다. 나는 타임 스탬프가 업데이트되고 적절한 행이 업데이트 된 테이블에서 SP의 트리밍 된 버전으로 빠른 테스트를 실행했습니다. – jesse
업데이트해야 할 수천 개의 행이있을 수 있으므로 성능상의 이유로 DB에 보관하는 것이 좋습니다. 아무 것도 인쇄하지 않습니다. MySQL에서 효과를 확인하기 만하면 단일 행이 업데이트 된 것을 볼 수 있습니다. – Devin