使用INSERT INTO SELECT和VALUES MYSQL PDO

时间:2017-09-20 12:56:27

标签: php mysql pdo

经过大量的谷歌搜索并在StackOverflow中运行不同的问题后,我还没有真正找到解决问题的解决方案。

我需要从2个表和$ _POST请求中将数据插入MySQL表。

我管理了我需要的2个表中的信息,但我似乎无法插入$ _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语句之后寻找更多数据以插入到开放列的表中但是它没有获取呈现给它的VALUES,可能是由于我的语法错误

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

1 个答案:

答案 0 :(得分:0)

你说:

  

服务器不会抛出错误,它会正常执行但没有数据   插入

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

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

关于在VALUES语句中使用INSERT INTO...SELECT子句:它不起作用。实际上你会收到一个" MySQL语法错误"消息。

您必须包含PHP值,例如PHP变量$order_name$order_address$order_phone,作为SELECT部分中的列标识符。

关于sql语句中使用的参数标记,这是php.netmysqli::prepare页面上关于它们的内容 - php.net没有在PDO::prepare上指定这一点页面也是,我不知道为什么不:

  

注意:   标记仅在SQL语句中的某些位置是合法的。例如,允许它们在INSERT语句的VALUES()列表中(指定行的列值),或与WHERE子句中的列进行比较以指定比较值。   但是,它们不允许用于标识SELECT语句返回的列的选择列表中的标识符(例如表名或列名),或者指定二元运算符的两个操作数,例如=等号。 / p>

最后,代码:

<?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();
}
祝你好运!