【问题标题】:call stored procedure using php使用php调用存储过程
【发布时间】:2011-08-04 06:10:30
【问题描述】:

我用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;

?> 

现在它给出了错误

PROCEDURE Fourthes_a.sp_sel_test 无法返回给定上下文中的结果集

【问题讨论】:

  • 源代码似乎与错误信息不符。哪一行是 26?
  • 你是从phpmyadmin,还是从mysql命令行测试过存储过程是否按预期返回?
  • phpmyAdmin 还说 PROCEDURE Fourthes_a.sp_sel_test 无法返回给定上下文中的结果集
  • 你的 php 代码很好,它的存储过程坏了。
  • 我感觉它是由于 php 版本...它显示 5.2.9

标签: php mysql stored-procedures


【解决方案1】:

mysql_query() 在查询失败时返回 false。您没有检查您的 sproc 查询是否成功,因此很可能您将该布尔值 FALSE 传递给 fetch 函数,这是理所当然的抱怨。

为了正确的错误处理,像这样重写你的代码,作为一个最低限度的代码:

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

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

【讨论】:

  • 用你的代码给出错误 PROCEDURE Fourthes_a.sp_sel_test can't return a result set in the given context
【解决方案2】:

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

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

请参阅MySQL Client Flags 了解更多详情。 PHP MySQL 不允许您在单个查询中运行多个语句。为了克服这个问题,您必须通过在您的连接中设置 CLIENT_MULTI_STATEMENTS 标志来告诉 PHP 允许此类查询。

【讨论】:

  • 它应该可以工作。如果它不起作用。尝试使用标志 131072 或 199608 再次调用 mysql_connect。这将设置多个结果标志。
【解决方案3】:

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

创建过程sp_sel_test(OUT yourscalarvariable INT/TEXT...)

返回结果集的语句不能在存储函数中使用。这包括不使用 INTO 将列值提取到变量中的 SELECT 语句、SHOW 语句和 EXPLAIN 等其他语句。对于可以在函数定义时确定返回结果集的语句,发生不允许从函数返回结果集错误 (ER_SP_NO_RETSET_IN_FUNC)。对于只能在运行时确定返回结果集的语句,PROCEDURE %s can't return a result set in the given context 发生错误 (ER_SP_BADSELECT)。

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

       SELECT * FROM category **INTO** c;

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

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 2016-08-29
    • 2012-03-07
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2017-05-21
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多