【问题标题】:Query with PHP using PDO are not inserted in MySQL使用 PDO 的 PHP 查询未插入 MySQL
【发布时间】:2014-05-14 03:01:03
【问题描述】:

我用 PHP 在我的 MySQL 数据库中插入一些数据,使用 PDO

$connection->query(
    "INSERT INTO eOrderManagement.first_name (first_name)
    VALUES ('" . $firstName . "');

    INSERT INTO eOrderManagement.last_name (last_name)
    VALUES ('" . $lastName . "');

    INSERT INTO eOrderManagement.section (section)
    VALUES ('" . $section . "');

    INSERT INTO eOrderManagement.order (creation_date, wished_delivery_date, status, email, first_name_id, last_name_id, section_id)
    VALUES ('" . $creationDate . "', '" . $wishedDeliveryDate . "', 'En attente', '" . $email . "', (SELECT first_name_id FROM eOrderManagement.first_name WHERE first_name LIKE '" . $firstName . "'), (SELECT last_name_id FROM eOrderManagement.last_name WHERE last_name LIKE '" . $lastName . "'), (SELECT section_id FROM eOrderManagement.section WHERE section LIKE '" . $section . "'));

    INSERT INTO eOrderManagement.equipment (description, imputation, cost, maintenance_cost, order_id)
    VALUES ('" . $description . "', '" . $imputation . "', '" . $cost . "', '" . $maintenanceCost . "', (SELECT MAX(order_id) FROM eOrderManagement.order));"
    );

前三个请求被插入到我的数据库中,但最后两个没有。 我尝试将它们手动插入到 MySQL Commande Line 中,直接使用查询中的数据(与 PHP 中的变量不同),并且所有查询都正确插入数据。

知道为什么这两个查询没有插入任何东西吗? 我正在谈论的两个查询是:

    INSERT INTO eOrderManagement.order (creation_date, wished_delivery_date, status, email, first_name_id, last_name_id, section_id)
    VALUES ('" . $creationDate . "', '" . $wishedDeliveryDate . "', 'En attente', '" . $email . "', (SELECT first_name_id FROM eOrderManagement.first_name WHERE first_name LIKE '" . $firstName . "'), (SELECT last_name_id FROM eOrderManagement.last_name WHERE last_name LIKE '" . $lastName . "'), (SELECT section_id FROM eOrderManagement.section WHERE section LIKE '" . $section . "'));

    INSERT INTO eOrderManagement.equipment (description, imputation, cost, maintenance_cost, order_id)
    VALUES ('" . $description . "', '" . $imputation . "', '" . $cost . "', '" . $maintenanceCost . "', (SELECT MAX(order_id) FROM eOrderManagement.order));"

【问题讨论】:

    标签: php mysql sql pdo insert


    【解决方案1】:

    order 是 SQL 的保留字。所以你必须引用你的表名order

    `eOrderManagement.order`
    

    尝试以下方法:

    INSERT INTO `eOrderManagement.order` (creation_date, wished_delivery_date, status, email, first_name_id, last_name_id, section_id)
        VALUES ('" . $creationDate . "', '" . $wishedDeliveryDate . "', 'En attente', '" . $email . "', (SELECT first_name_id FROM eOrderManagement.first_name WHERE first_name LIKE '" . $firstName . "'), (SELECT last_name_id FROM eOrderManagement.last_name WHERE last_name LIKE '" . $lastName . "'), (SELECT section_id FROM eOrderManagement.section WHERE section LIKE '" . $section . "'));
    
        INSERT INTO eOrderManagement.equipment (description, imputation, cost, maintenance_cost, order_id)
        VALUES ('" . $description . "', '" . $imputation . "', '" . $cost . "', '" . $maintenanceCost . "', (SELECT MAX(order_id) FROM `eOrderManagement.order`));"
    

    此外,您的查询容易受到 SQL 注入的攻击。所以我建议你使用带参数的预处理语句。

    例如:

    $query = $db->prepare('INSERT INTO eOrderManagement.equipment 
                              (description, 
                               imputation, 
                               cost, 
                               maintenance_cost, 
                               order_id) 
                       VALUES (:description, 
                               :imputation, 
                               :cost, 
                               :maintenanceCost, 
                               (SELECT MAX(order_id) FROM `eOrderManagement.order`)
                              )'
                 );
    
    $query->bindValue(':description', $description, PDO::PARAM_STR);
    ...
    

    $query->execute(':description' => $description, :imputation => $imputation, ...);
    

    另外一点,如果同时执行两个插入进程怎么办?

     SELECT MAX(order_id) FROM `eOrderManagement.order` 
    

    会返回不正确的值。使用PDO的lastInsertId()函数。

    【讨论】:

      【解决方案2】:

      事实上,你的问题比愚蠢的语法问题要深得多。

      首先,这样的数据库结构绝对没有意义。
      让表格由一个字段组成不会让您恢复数据!

      因此,您必须首先制作 ONE 表,而不是前三个,其中包含所有字段。

      然后创建 ONE 插入查询,该查询必须使用准备好的语句,而不是像您在此处那样插入变量。

      您应该使用 LAST_INSERT_ID()/PDO::insertId() 来处理表关系,而不是这些选择。

      【讨论】:

      • 是的,单字段表有点奇怪,其实是做一些自动补全的。在我的项目中,这是有道理的。感谢 LAST_INSERT_ID()/PDO::insertId()
      • 它在任何情况下都没有任何意义。您对任何“自动完成”的想法都是错误的。可以使用常规表格进行自动完成
      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多