Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用从mysqli查询检索的数据在php中执行另一个mysqli查询_Php_Loops_Mysqli - Fatal编程技术网

使用从mysqli查询检索的数据在php中执行另一个mysqli查询

使用从mysqli查询检索的数据在php中执行另一个mysqli查询,php,loops,mysqli,Php,Loops,Mysqli,我在数据库中有两个表,一个是User\u info,另一个是Product\u info。我想做的是,如果给我User\u id,那么我将检查表User\u info中与User\u id对应的产品id。然后,我将使用检索到的Product\u id从表Product\u info中查找Product\u name **Table-User_info** User_id Product_id 2 P1 3 P4 2

我在数据库中有两个表,一个是
User\u info
,另一个是
Product\u info
。我想做的是,如果给我
User\u id
,那么我将检查表
User\u info
中与
User\u id
对应的
产品id
。然后,我将使用检索到的
Product\u id
从表
Product\u info
中查找
Product\u 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\u id
2
,那么我想显示
A
C

以下是我编写的代码:

    $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

使用存储过程:

PHP:

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
/**
这将返回一个结果集,仅包含产品名称

是一个关于存储过程的好教程


好运

尝试了各种方法,最终以这种方式结束。 我没有直接搜索
Product\u id
,而是将它们存储在一个数组中,然后在
Product\u 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的单个查询,而不是两个单独的查询
  • 您必须使用mysqli,而不是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()直接输出产品或将其传递到模板中。

    您应该查看存储过程。实际上,您可以创建一个mysql函数,该函数接受参数并执行所需的任何逻辑。您可以从一个存储过程返回多个结果集。@Matthew您能举一个小例子吗?检查联接表非常感谢您向我介绍存储过程。用SP替换简单联接是一个非常奇特的想法。将必须在这里使用的联接放在一边,甚至在SQL中的运算符中,为什么不正确地使用预先准备好的语句?例如,只准备一次查询?@YourCommonSense你的意思是这样的$query=“从产品信息中选择产品信息。产品名称=用户。产品名称=用户。产品名称=用户。用户名称=?”;
    $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);