代码之家  ›  专栏  ›  技术社区  ›  MW_dev

存储过程、MySQL和PHP

  •  3
  • MW_dev  · 技术社区  · 16 年前

    我有一个小的爱好项目,我正在工作,由于各种原因,我走了灯的路线。在MySQL和PHP5中使用存储过程有什么提示/技巧/陷阱或良好的起点吗?我的MySQL版本支持存储过程。

    5 回复  |  直到 10 年前
        1
  •  7
  •   Dan Straw    13 年前

    @michal kralik-不幸的是,PDO使用的MySQL C API有一个bug,这意味着使用某些版本的MySQL运行上述代码会导致错误:

    “语法错误或访问冲突:例程$procedure\U name的1414 OUT或INOUT参数$parameter\U number不是变量或新的伪变量”。

    您可以在上看到错误报告 bugs.mysql.com . 它已针对5.5.3+版本进行了修复;6.0.8+.

    要解决此问题,您需要在&中分离;输出参数,并使用用户变量存储结果,如下所示:

    $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(:in_string, @out_string)");
    $stmt->bindParam(':in_string', 'hello'); 
    
    // call the stored procedure
    $stmt->execute();
    
    // fetch the output
    $outputArray = $this->dbh->query("select @out_string")->fetch(PDO::FETCH_ASSOC);
    
    print "procedure returned " . $outputArray['@out_string'] . "\n";
    
        2
  •  4
  •   halfer Rahul Baradia    10 年前

    忘了 mysqli ,它比PDO更难使用,应该已经被删除。的确,它比mysql带来了巨大的改进,但要在mysqli中实现同样的效果,有时需要在PDO上付出巨大的努力,即关联 fetchAll .

    相反,请看一看 PDO 明确地 prepared statements and stored procedures .

    $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
    $value = 'hello';
    $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 
    
    // call the stored procedure
    $stmt->execute();
    
    print "procedure returned $value\n";
    
        3
  •  2
  •   MarkR    16 年前

    实际上,在MySQL5中使用mysqli或PDO调用存储过程并不是强制性的。使用旧的mysql_uu函数可以很好地调用它们。唯一不能做的就是返回多个结果集。

        4
  •  2
  •   StepUp    8 年前

    你需要使用 MySQLI 服务提供商 :

    $mysqli = new MySQLI(user,pass,db);
    
    $result = $mysqli->query("CALL sp_mysp()");
    

    使用SPs时,需要关闭第一个结果集,否则会收到错误。以下是更多信息:

    http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/ (断开的链接)

    准备好的发言 ,我觉得很直截了当:

      $stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");
    
      $stmt->bind_param("s", $myName);
    
      $stmt->execute();
    

    MySQLI文档: http://no.php.net/manual/en/book.mysqli.php

        5
  •  0
  •   SuperRoach    15 年前

    一个示例查询:

    $query = "Call HeatMatchInsert('$mMatch', '$mOpponent', '$mDate', $mPlayers, $mRound,  '$mMap', '$mServer', '$mPassword', '$mGame', $mSeason, $mMatchType)";
    

    虽然抽象地说,尽管制作第一个基于php存储过程的web应用非常困难(mssql有很好的文档记录,但事实并非如此),但它在完成后非常棒——由于分离,更改非常容易。