【问题标题】:Calling MySQL stored procedure in PHP only updates one row在 PHP 中调用 MySQL 存储过程只更新一行
【发布时间】:2011-04-05 23:36:29
【问题描述】:

我在 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 编写,使用 SQL 仅用于 SELECT 和 UPDATE。
  • 您是否正在打印“updated: $result”?那将打印一个“1”。我在更新时间戳和正确行的表上使用精简版 SP 进行了快速测试。
  • 出于性能原因,我宁愿将它保存在数据库中,因为它可能需要更新数千行。我没有打印任何东西。只是检查 MySQL 中的效果,这是我看到单行更新的地方。

标签: php mysql stored-procedures mysqli


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2014-09-07
    相关资源
    最近更新 更多