【问题标题】:Using the data retrieved from a mysqli query to execute another mysqli query in php使用从 mysqli 查询中检索到的数据在 php 中执行另一个 mysqli 查询
【发布时间】:2016-03-31 11:00:21
【问题描述】:

我在 DB 中有 2 个表,一个是 User_info,另一个是 Product_info。我想要做的是,如果给我User_id,那么我将在表User_info 中检查与User_id 对应的Product_id。然后我将使用我检索到的这个Product_id 从表Product_info 中找到Product_name

**Table-User_info**
User_id    Product_id

 2            P1
 3            P4
 2            P3
 45           P7


**Table-Product_info**
Product_name    Product_id

 A               P1
 B               P4
 C               P3
 D               P7

例如,如果给我User_id2,那么我想显示AC

以下是我写的代码:

    $mysqli=new mysqli("127.0.0.1","root","","bargad");//Connecting to the database
                if($mysqli->connect_error)
                {
                    echo "Couldnt connect to server";

                }
                else
                {
                    $query="SELECT Product_id from User_info WHERE User_id=?";
                    $statement=$mysqli->prepare($query);
                    //binding parameters
                    $statement->bind_param('s',$u_id);//u_id is given
                    $statement->execute();
                    $statement->bind_result($pdt_id);
                    while($statement->fetch())
                    {

                        $query2="SELECT Product_name from Product_info WHERE Product_id=?";
                        $statement_2=$mysqli->prepare($query2);
                        $statement_2->bind_param('s',$pdt_id);
                        $statement_2->execute();
                        $statement_2->bind_result($pdt_name);
                        while($statement_2->fetch())
                        {
                            echo $Product_name;
                        }
                     }
                 }



> The error i got is -Fatal error: Uncaught Error: Call to a member
> function bind_param() on boolean and  Stack trace: #0 {main} thrown

【问题讨论】:

  • 您应该查看存储过程。您基本上可以创建一个接受参数并执行您需要的任何逻辑的 mysql 函数。您可以从一个存储过程返回多个结果集。
  • @Matthew 你能举个小例子吗?
  • 检查连接表w3schools sql join

标签: php loops mysqli


【解决方案1】:

你必须改变两件事。

  1. 首先,必须使用带有 JOIN 的单个查询,而不是两个单独的查询。
  2. 您必须使用PDO 而不是mysqli。

有了这个,你只需要几行代码:

$dsn = "mysql:host=127.0.0.1;dbname=bargad;charset=utf8";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, "root", "", $opt);

$query = "SELECT Product_name FROM Product_info p, User_info u 
                 WHERE p.Product_id=u.Product_id AND User_id=?"; 
$stmt = $pdo->prepare($query);
$stmt->execute($u_id);
$data = $stmt->fetchAll(PDO::FETCH_COLUMN);

在 $data 变量中,您有您的产品,您可以使用 foreach() 直接回显或将其传递到模板中。

【讨论】:

    【解决方案2】:

    试了各种方法,终于搞定了。 我没有直接搜索Product_id,而是将它们存储在一个数组中,然后在Product_info 中搜索。它完成了这项工作。

        $mysqli=new mysqli("127.0.0.1","root","","bargad");//Connecting to the database
                        if($mysqli->connect_error)
                        {
                            echo "Couldnt connect to server";
    
                        }
                        else
                        {
                            $query="SELECT Product_id from User_info WHERE User_id=?";
                            $statement=$mysqli->prepare($query);
                            //binding parameters
                            $statement->bind_param('s',$u_id);//u_id is given
                            $statement->execute();
                            $statement->bind_result($pdt_id);
                            $i=0;//index of the array
                            while($statement->fetch())
                            {
                                $j[i]=$pdt_id;
                                ++i;
                            }
                            foreach($j as $pdt_id)
                            {
                             $query2="SELECT Product_name from Product_info WHERE Product_id=?";
                                $statement_2=$mysqli->prepare($query2);
                                $statement_2->bind_param('s',$pdt_id);
                                $statement_2->execute();
                                $statement_2->bind_result($pdt_name);
                                while($statement_2->fetch())
                                {
                                    echo $Product_name;
                                }
                             }
                         }
    

    【讨论】:

    • 抛开这里必须使用的join,甚至SQL中的IN操作符,为什么不正确使用prepared statements——即只准备一次查询?
    • @YourCommonSense 你的意思是这样的? $query="SELECT Product_info.Product_name From Product_info INNER JOIN User_info ON Product.Product_id=User.Product_id AND User.User_id=?";
    【解决方案3】:

    使用存储过程:

    PHP:

    $stmt = $dbh->prepare("CALL myProcedure($userId)");
    
    // call the stored procedure
    $stmt->execute();
    

    MYSQL:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `productName`(IN userId INT)
    
    DECLARE productId INT;
    SET productId = SELECT Product_id from User_info WHERE User_id=userId;
    
    SELECT Product_name from Product_info WHERE Product_id=productId
    
    BEGIN
    /**
    

    这将返回一个结果集,仅包含产品名称

    This 是一个很好的存储过程教程。

    祝你好运

    【讨论】:

    • 非常感谢您向我介绍存储过程。
    • 用 SP 代替简单的连接是一个非常奇特的想法。
    猜你喜欢
    • 2019-02-07
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2016-04-11
    • 2013-05-13
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多