使用php调用存储过程

时间:2011-04-12 21:37:12

标签: php mysql stored-procedures

我使用mysql编写了一个基本的存储过程

DELIMITER // 

CREATE PROCEDURE `sp_sel_test`()
BEGIN

    SELECT * FROM category c;

END// 
DELIMITER ;

现在我从php中调用它

php代码是:

  <?php
    $txt = $_GET['id'];
    $name = $_GET['name'];
$con = mysql_connect("localhost","four","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("fourthes_a", $con);



//$result = mysql_query("select * from new_c where name like %". $name ."% or c_name like %" . $name . "% order by name asc;");


$result = mysql_query("call sp_sel_test()");
    if ($result === FALSE) {
    die(mysql_error());
}
while($row = mysql_fetch_array($result))
  {
  echo $row['category_id'] . " " . $row['c_name'];
  ?>
  <br />
  <?php
  }

mysql_close($con);
    echo $txt;

?> 

现在它给出了错误

程序fourthes_a.sp_sel_test无法在给定的上下文中返回结果集

3 个答案:

答案 0 :(得分:5)

查询失败时,

mysql_query()返回false。你没有检查你的sproc查询是否成功,所以你很可能将那个布尔值FALSE传递给fetch函数,这是正确的抱怨。

为了正确的错误处理,将这样的代码重写为一个简单的代码:

$res = mysql_query('call sp_sel_test()');
if ($res === FALSE) {
    die(mysql_error());
}

永远不要假设查询成功。即使SQL语法是完美的,也有太多其他原因导致查询无法检查它是否有效。

答案 1 :(得分:4)

您需要在连接时设置客户端标志,以便使用php存储过程。使用此:

mysql_connect($this->h,$this->u,$this->p,false,65536);

有关详细信息,请参阅MySQL Client Flags。 PHP MySQL不允许您在单个查询中运行多个语句。要解决这个问题,您必须通过在连接中设置CLIENT_MULTI_STATEMENTS标志来告诉PHP允许此类查询。

答案 2 :(得分:1)

我知道上一个答案是一年前,但是......

CREATE PROCEDURE sp_sel_test(OUT yourscalarvariable INT / TEXT ...)

返回结果集的语句不能在存储的函数中使用。这包括不使用INTO将列值提取到变量,SHOW语句和其他语句(如EXPLAIN)的SELECT语句。对于可以在函数定义时确定以返回结果集的语句,将发生不允许从函数错误返回结果集(ER_SP_NO_RETSET_IN_FUNC)。对于只能在运行时确定以返回结果集的语句,PROCEDURE%s无法在给定的上下文错误中返回结果集(ER_SP_BADSELECT)。

所以,你的选择应该是这样的:

       SELECT * FROM category **INTO** c;

http://www.cs.duke.edu/csl/docs/mysql-refman/stored-procedures.html