Вызов хранимой процедуры MySQL в PHP обновляет только одну строку - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть хранимая процедура в 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 используют одно и то же имя пользователя.

1 Ответ

0 голосов
/ 06 апреля 2011

Я думаю, что 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;

Поскольку это было единственное место, где возвращался набор результатов, устранение возвращенных наборов решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...