【问题标题】:How to make a search query in stored procedure with OR, AND keyword using php and mysql?如何使用 php 和 mysql 在存储过程中使用 OR、AND 关键字进行搜索查询?
【发布时间】:2015-12-29 00:51:45
【问题描述】:

我正在存储过程中进行搜索查询,但问题是每次搜索单词时都会显示错误。

我的存储过程

DELIMITER//
CREATE PROCEDURE viewMedicine(product_name varchar(40), description text)
    READS SQL DATA
    DETERMINISTIC
begin
    PREPARE STMT FROM "SELECT * FROM products WHERE product_name like ? OR description like ? ORDER BY ASC";
        SET @s=product_name;
        SET @ss=description;
    EXECUTE STMT USING @s, @ss;
end//
DELIMITER;

php 代码:

                $search="";

                if(isset($_POST['search_txt'])){    

                    $search=$_POST['search_txt'];

                    if($search!="")

                        $sql="Call searchMedicine('$search%')";

                    else
                        $sql="SELECT id, product_name, description, price, quantity, date FROM products ORDER BY product_name ASC";
                }
                else
                    $sql="SELECT id, product_name, description, price, quantity, date FROM products ORDER BY product_name ASC";

                $result = mysqli_query($conn, $sql);

                while($test = mysqli_fetch_array($result))
                {

                    $id = $test['id'];
            ?>

【问题讨论】:

  • 你的猫跳到你的键盘上了吗?

标签: php stored-procedures mysqli


【解决方案1】:

您看到了什么错误?您的存储过程称为 viewMedicine 并有两个参数,product_name 和 description。您的 sql 代码正在调用 searchMedicine 并且只传递了一个参数 $search。

您对 mysql_fetch_array 的调用很可能不正确。您需要传递 mysqli_query 返回的 mysql_result 对象。如果没有看到更多您的代码,我无法确定。请看我的评论。

编辑:感谢您提供代码。您对 mysqli_query 的使用是正确的,但存在语法或参数错误。查看您的 SPROC 的定义,我会说这是一个参数错误。

尝试进行以下更改:

$search="";

if (isset($_POST['search_txt'])){    

    $search=$_POST['search_txt'];

    if($search!="")
        $sql="Call viewMedicine('$search%', '')";
    else
        $sql="SELECT id, product_name, description, price, quantity, date FROM products ORDER BY product_name ASC";
 }
 else {
     $sql="SELECT id, product_name, description, price, quantity, date FROM products ORDER BY product_name ASC";
 }

 $result = mysqli_query($conn, $sql);

 if(!$result) {
     echo("Error description: " . mysqli_error($conn));
 }
 else {
     while($test = mysqli_fetch_array($result))
     {
         $id = $test['id'];
?>

如果您不需要在查询中搜索描述,请将其从 SPROC 中删除:

PREPARE STMT FROM "SELECT * FROM products WHERE product_name like ?";
    SET @s=product_name;
EXECUTE STMT USING @s;

然后,您在代码中的调用将变为:

...

  if($search!="")
            $sql="Call viewMedicine('$search%')";
        else

...

编辑 2:

如果你想搜索描述,你需要把它放到脚本中。您可能希望以与搜索产品名称相同的方式执行此操作,我假设是通过 $_POST 数组,因此我将为该假设编写代码。当然,请注意,您需要对将 POST 数据发送到此脚本的网络表单进行必要的更改。

$search="";

if (isset($_POST['search_txt']) && 
    isset($_POST['description_txt'])){    

    $search=$_POST['search_txt'];
    $description=$_POST['description_txt'];

    if($search != "" && $description != "")
        $sql="Call viewMedicine('$search%', '%$description%')";
    else
        $sql="SELECT id, product_name, description, price, quantity, date FROM products ORDER BY product_name ASC";
 }
 else {
     $sql="SELECT id, product_name, description, price, quantity, date FROM products ORDER BY product_name ASC";
 }

 $result = mysqli_query($conn, $sql);

 if(!$result) {
     echo("Error description: " . mysqli_error($conn));
 }
 else {
     while($test = mysqli_fetch_array($result))
     {
         $id = $test['id'];
?>

【讨论】:

  • Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in
  • 你能显示 $sql="Call searchMedicine('$search%')"; 之后的行吗?特别是堆栈跟踪显示警告的行及其周围的行。
  • @user3808774 请将该特定错误编辑到您的问题中,以便可以帮助您的人无需阅读评论部分即可看到它。谢谢!
  • @user3808774 为什么不检查错误并打印mysqli_error($conn) 以显示错误原因?
  • 先生,我收到此错误:调用 searchMedicine('BIO%') 执行参数不正确
猜你喜欢
  • 2021-05-11
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多