我在MySQL中有一个存储过程,它应该更新表中的一列。当我运行在PHP中调用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提示符使用相同的用户名。
我不知道为什么这不起作用,但它可以使用SQL编写,只用于SELECT和UPDATE。 – 2011-04-05 23:44:56
你可能打印“更新:$结果”?这将打印一个“1”。我做了一个快速测试,在时间戳正在更新并且正确的行已更新的表上,对表格中的SP进行了精简版测试。 – jesse 2011-04-06 00:07:57
出于性能原因,我宁愿将它放在数据库中,因为它可能需要更新数千行。 我不打印任何东西。只需检查MySQL中的效果,这是我看到单行更新的地方。 – Devin 2011-04-06 01:21:43