【问题标题】:an alternative to stored procedures存储过程的替代方案
【发布时间】:2023-04-04 21:18:01
【问题描述】:

我在使用存储过程时遇到问题。调用存储过程对我不起作用。所以我用一条sql语句替换了存储过程。但是现在,我有一些接收参数的存储过程。例如

CREATE PROCEDURE get_category_details_proc(IN incat_id INT)
BEGIN 

SELECT name, desc 
FROM category
WHERE cat_id = incat_id;

END

如何使用简单的 sql 语句来替换它?

更多详情请查看my previous question

我的数据库连接类中已经有了这个功能:

public static function GetRow($sqlQuery, $params = null, $fetchStyle = PDO::FETCH_ASSOC)
 {
  $result = null;
  try
  {
   $database_handler = self::GetHandler();
   $statement_handler = $database_handler->prepare($sqlQuery);
   $statement_handler->execute($params);
   $result = $statement_handler->fetch($fetchStyle);

  }
  catch(PDOException $e)
  {
   self::Close();
   trigger_error($e->getMessage(), E_USER_ERROR);

  }
  return $result;


 }

在我实际调用存储过程的另一个类中:

public static function GetCategoryDetails($categoryID)
 {
  $sql = CALL get_category_details_proc(:category_id);
              $params = array(':category_id' => $categoryID);
  return DatabaseHandler::GetRow($sql,$params);

 }

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    使用如下所示的 Prepared 语句:

    $pdo = new PDO(...);
    $statement = $pdo->prepare('SELECT name, desc FROM category WHERE cat_id = ?');
    $statement->execute(array(10)); // incat_id
    $rows = $statement->fetchAll();
    

    【讨论】:

    • 感谢您的回复。我已经包含了更多的编码,以便您可以帮助我。
    【解决方案2】:

    您可以只使用连接构建查询字符串,但正如 Rick 在下面提到的,请确保强制转换/验证。始终清理所有外部输入 - 使用 mysql_real_escape_string,或者更好的是,准备好的语句

    $query = "select name, desc FROM category where cat_id = ".$incat_id;
    

    然后将其传递给 PHP mysql_query

    $result=mysql_query($query);
    

    【讨论】:

    • 我不会投反对票,但您应该注意只对已投/验证的数字执行此操作。
    • 抱歉没有看到问题中的 pdo 标签,是的,可能不是最好的解决方案。
    • 顺便说一句,你在最后有一个额外的报价。
    • 再次感谢您帮助我清理我的 PHP 混乱
    • 谢谢!我将尝试 Jason 的建议。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多