Php 使用INSERT INTO SELECT和值MYSQL PDO
在StackOverflow中搜索了很多不同的问题后,我还没有真正找到解决问题的方法 我需要从两个表和一个$u POST请求将数据插入MySQL表 我管理了所需的两个表中的信息,但似乎无法插入$\u POST变量 这是我现在拥有的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,
$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。先做第一件事,然后: