Php 使用INSERT INTO SELECT和值MYSQL PDO

Php 使用INSERT INTO SELECT和值MYSQL PDO,php,mysql,pdo,Php,Mysql,Pdo,在StackOverflow中搜索了很多不同的问题后,我还没有真正找到解决问题的方法 我需要从两个表和一个$u POST请求将数据插入MySQL表 我管理了所需的两个表中的信息,但似乎无法插入$\u POST变量 这是我现在拥有的 $stmt = $conn->prepare("INSERT INTO user_orders (order_item_id, order_item, order_quantity, order_user, order_name, order_address,

在StackOverflow中搜索了很多不同的问题后,我还没有真正找到解决问题的方法

我需要从两个表和一个$u POST请求将数据插入MySQL表

我管理了所需的两个表中的信息,但似乎无法插入$\u POST变量

这是我现在拥有的

$stmt = $conn->prepare("INSERT INTO user_orders (order_item_id, order_item, order_quantity, order_user, order_name, order_address, order_phone) SELECT item_ID, item_name, item_quantity, user_name FROM $user_cart, user_main WHERE item_status = 'carted' and user_name = :user_name VALUES ($order_name, $order_address, $order_phone)");
$stmt->bindParam(":user_name", $_SESSION['login_user']);
$stmt->execute();
服务器不会抛出错误,它会正确执行,但不会插入任何数据

我遵循的逻辑是,它在SELECT语句之后寻找更多数据,以插入到表中的开放列中,但它没有获取提供给它的值,这可能是由于我这方面的语法错误

问题:使用1条准备好的PDO语句从2个表和$u POST请求中插入所需数据的正确方法是什么?您说:

服务器不会抛出错误,它会正确执行,但不会生成任何数据 插入

你是如何得出这个结论的?如果没有错误报告和异常处理,您无法确定

在我的代码中有两条
TODO
注释。搜索它们并按照说明进行操作

关于在
插入到…SELECT语句中使用
子句:它不起作用。实际上,您将收到一条“MySQL语法错误”消息

您必须将PHP值,例如PHP变量
$order\u name
$order\u address
$order\u phone
作为列标识符包含在
选择部分中

关于sql语句中使用的参数标记,页面上是这么说的-php.net在页面上也没有指定,我不知道为什么不指定:

注: 这些标记仅在SQL语句中的某些位置是合法的。例如,可以在INSERT语句的VALUES()列表中使用它们(为行指定列值),也可以在WHERE子句中与列进行比较时使用它们来指定比较值。 但是,它们不允许用于标识符(如表名或列名),也不允许用于命名select语句返回的列的select列表,也不允许用于指定二进制运算符(如=等号)的两个操作数

最后,代码:

<?php

/*
 * ============================================================
 * Set error reporting level and display errors on screen.
 * Use it ONLY ON A DEVELOPMENT SYSTEM, NEVER ON PRODUCTION!
 * If you activate it on a live system, then the users will see
 * all the errors of your system. And you don't want this!
 * ============================================================
 */
error_reporting(E_ALL);
ini_set('display_errors', 1);

try {
    // Read needed variables.
    // TODO: Provide your values.
    $user_cart_table_name = 'user_cart_table_name';
    $user_name = 'user name value';
    $order_name = 'order name value';
    $order_address = 'order address value';
    $order_phone = 'order phone value';

    // Create a PDO instance as db connection.
    // TODO: Delete this and use your own connection. 
    //       But use the first two driver options that I defined here as
    //       the options on your connection.
    $conn = new PDO(
            'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
            , 'myuser'
            , 'mypass'
            , array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => FALSE,
        PDO::ATTR_PERSISTENT => TRUE,
            )
    );

    /*
     * The sql statement - it will be prepared.
     * 
     * Familiarize yourself with the sprintf() function.
     * It is your very good friend when building complex
     * sql statements.
     */
    $sql = sprintf('INSERT INTO user_orders (
                        order_item_id,
                        order_item,
                        order_quantity,
                        order_user,
                        order_name,
                        order_address,
                        order_phone
                    ) 
                    SELECT 
                        item_ID,
                        item_name,
                        item_quantity,
                        user_name,
                        "%s",
                        "%s",
                        "%s" 
                    FROM 
                        %s,
                        user_main 
                    WHERE 
                        item_status = "carted" 
                        AND user_name = :user_name'
            , $order_name
            , $order_address
            , $order_phone
            , $user_cart_table_name
    );

    // Prepare the sql statement.
    $stmt = $conn->prepare($sql);

    // Bind the input parameters to the prepared statement.
    $bound = $stmt->bindValue(':user_name', $user_name, PDO::PARAM_STR);

    // Execute the prepared statement.
    $executed = $stmt->execute();

    // Get the last insert id.
    $lastInsertId = $conn->lastInsertId();

    // Display last insert id.
    echo 'Record added with id ' . $lastInsertId;

    // Close connection.
    $conn = NULL;
} catch (PDOException $exc) {
    echo $exc->getMessage();
    exit();
} catch (Exception $exc) {
    echo $exc->getMessage();
    exit();
}
你说:

服务器不会抛出错误,它会正确执行,但不会生成任何数据 插入

你是如何得出这个结论的?如果没有错误报告和异常处理,您无法确定

在我的代码中有两条
TODO
注释。搜索它们并按照说明进行操作

关于在
插入到…SELECT语句中使用
子句:它不起作用。实际上,您将收到一条“MySQL语法错误”消息

您必须将PHP值,例如PHP变量
$order\u name
$order\u address
$order\u phone
作为列标识符包含在
选择部分中

关于sql语句中使用的参数标记,页面上是这么说的-php.net在页面上也没有指定,我不知道为什么不指定:

注: 这些标记仅在SQL语句中的某些位置是合法的。例如,可以在INSERT语句的VALUES()列表中使用它们(为行指定列值),也可以在WHERE子句中与列进行比较时使用它们来指定比较值。 但是,它们不允许用于标识符(如表名或列名),也不允许用于命名select语句返回的列的select列表,也不允许用于指定二进制运算符(如=等号)的两个操作数

最后,代码:

<?php

/*
 * ============================================================
 * Set error reporting level and display errors on screen.
 * Use it ONLY ON A DEVELOPMENT SYSTEM, NEVER ON PRODUCTION!
 * If you activate it on a live system, then the users will see
 * all the errors of your system. And you don't want this!
 * ============================================================
 */
error_reporting(E_ALL);
ini_set('display_errors', 1);

try {
    // Read needed variables.
    // TODO: Provide your values.
    $user_cart_table_name = 'user_cart_table_name';
    $user_name = 'user name value';
    $order_name = 'order name value';
    $order_address = 'order address value';
    $order_phone = 'order phone value';

    // Create a PDO instance as db connection.
    // TODO: Delete this and use your own connection. 
    //       But use the first two driver options that I defined here as
    //       the options on your connection.
    $conn = new PDO(
            'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
            , 'myuser'
            , 'mypass'
            , array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => FALSE,
        PDO::ATTR_PERSISTENT => TRUE,
            )
    );

    /*
     * The sql statement - it will be prepared.
     * 
     * Familiarize yourself with the sprintf() function.
     * It is your very good friend when building complex
     * sql statements.
     */
    $sql = sprintf('INSERT INTO user_orders (
                        order_item_id,
                        order_item,
                        order_quantity,
                        order_user,
                        order_name,
                        order_address,
                        order_phone
                    ) 
                    SELECT 
                        item_ID,
                        item_name,
                        item_quantity,
                        user_name,
                        "%s",
                        "%s",
                        "%s" 
                    FROM 
                        %s,
                        user_main 
                    WHERE 
                        item_status = "carted" 
                        AND user_name = :user_name'
            , $order_name
            , $order_address
            , $order_phone
            , $user_cart_table_name
    );

    // Prepare the sql statement.
    $stmt = $conn->prepare($sql);

    // Bind the input parameters to the prepared statement.
    $bound = $stmt->bindValue(':user_name', $user_name, PDO::PARAM_STR);

    // Execute the prepared statement.
    $executed = $stmt->execute();

    // Get the last insert id.
    $lastInsertId = $conn->lastInsertId();

    // Display last insert id.
    echo 'Record added with id ' . $lastInsertId;

    // Close connection.
    $conn = NULL;
} catch (PDOException $exc) {
    echo $exc->getMessage();
    exit();
} catch (Exception $exc) {
    echo $exc->getMessage();
    exit();
}

我在这里看到的是一个
$\u会话
数组,而不是一个
$\u帖子
。是的。values中的最后3个值是issueBtw、
($order\u name、$order\u address、$order\u phone)
这些字符串中的任何一个?为什么您只准备了部分语句?进入查询的每个变量都应该准备好。只做其中一项是没有意义的。您应该选择要在第二项选择中插入的所有字段。您可以使用
连接
或为要注入到准备好的语句中的值添加占位符来实现这一点。所以最后没有松散的
值…
。我看到一个
$\u会话
数组,而不是
$\u POST
。是的。values中的最后3个值是issueBtw、
($order\u name、$order\u address、$order\u phone)
这些字符串中的任何一个?为什么您只准备了部分语句?进入查询的每个变量都应该准备好。只做其中一项是没有意义的。您应该选择要在第二项选择中插入的所有字段。您可以使用
连接
或为要注入到准备好的语句中的值添加占位符来实现这一点。所以最后没有松散的
值…
。首先,感谢您抽出时间,这一定是一个很大的麻烦。第二,你用绑定参数的方式杀了我,让foreach来做,这行代码对我来说毫无意义$inputParameterName=is_int($key)?($key+1):(“:”.ltrim($key,:”);绝对不知道这有什么用。我得到了代码中输入参数部分的数据类型,以及它的其他部分。你能解释一下上面那行代码中发生了什么吗?PS:即将测试它是否实际运行,请继续关注更新!更新:这是IF语句的简写。尽管如此,为什么要为一个值(用户名)构建如此复杂的foreach呢?更新2:即使在我完成TODO之后,结果也是一样的——没有抛出错误,DB表中也没有任何信息。我可以在inspector的“网络”选项卡中看到,信息是作为POST请求发送的,其他所有内容都是…@DenislavKaragiozov Hi。先做第一件事,然后: