mysql过程如何执行在循环中检索数据的查询然后返回自定义值

时间:2014-07-04 03:24:50

标签: mysql stored-procedures

我不明白程序是如何工作的,即使我搜索了几个主题/教程但只找到了无意义的例子。

在PHP中,我的代码看起来像这样:

function getFullPathFromID($ID)
{
  $path = '';
  while($result = $c->query("SELECT IDParentFolder,path FROM folders WHERE ID=$ID")->fetch())
  {
    $ID = $result->IDParentFolder;
    $path = $result->path.'/'.$path;
  }
  return $path;
}

我无法使用程序,我甚至无法查询db:

DELIMITER #
CREATE PROCEDURE getFullPathFromID(ID INT)    
  BEGIN
    SELECT path FROM folders WHERE ID = ID;
  END
#

当我用有效值执行它时,我仍然得到“MySQL返回一个空结果集(即零行)。”

那么如何执行在循环中检索数据然后返回自定义值的查询(每个步骤的值的串联)?

由于

3 个答案:

答案 0 :(得分:1)

存储过程中存在问题,因为标量id与表中的列具有相同的名称。所以,表达式:

 where id = id

没有达到你的预期。

你应该把它写成:

DELIMITER #
CREATE PROCEDURE getFullPathFromID(v_ID INT)    
  BEGIN
    SELECT path FROM folders f WHERE f.ID = v_ID;
  END
#

但是,我不确定这是否会解决没有选择任何行的问题。

答案 1 :(得分:0)

我终于明白了。

BEGIN
  DECLARE v_IDParentFolder INT;
  DECLARE v_Name VARCHAR(255);
  SET path='';
  REPEAT
    SELECT IDParentFolder,Name INTO v_IDParentFolder, v_Name FROM folders WHERE ID = IDFolder;
    SET IDFolder = v_IDParentFolder;
    SET path = CONCAT(v_Name,'/',path);
  UNTIL v_IDParentFolder IS null END REPEAT;
  SET path = CONCAT('/',path);
END

对于“SELECT FROM FROM folders”我错误地将'path'误认为'name',所以我确实得不到任何结果......

对于SQL中的其他初学者,尤其是过程,SELECT查询不会保存结果但返回它,为了只保存结果“INTO”必须在我的代码中使用,并且必须声明这些变量在程序开始时。

感谢那个向我投降的人,他真的很有帮助。

答案 2 :(得分:0)

你的代码错了,使用mysqli扩展你应该准备避免sql注入。

你不应该把查询放到一个循环中,你会遍历一个记录集,但在你的情况下你得到一行所以没有意义。这就是你应该做的:

$query = 'SELECT path FROM folders WHERE ID = ?';
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $id);
if ($stmt->execute()){
    $row = $stmt->fetch_assoc();
    $path = $row['path'];
}
return $path;