У меня есть хранимая процедура в 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 для sproc:
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
$$
Я могу запускать другие запросы из PHP, используя mysqli (также пробовал объект mysql).Я также не могу создать хранимые процедуры из PHP (без ошибок), и мне пришлось выполнить эту часть из приглашения MySQL.
PHP и моя подсказка MySQL используют одно и то же имя пользователя.