繁体   English   中英

在PHP中调用MySQL存储过程仅更新一行

[英]Calling MySQL stored procedure in PHP only updates one row

我在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提示符使用相同的用户名。

我认为当查询返回多个结果集时,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;

由于那是返回结果集的唯一位置,因此消除返回的集可以解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM