【问题标题】:MySQL: Prepared Statements with cross-table SELECTMySQL:使用跨表 SELECT 的预处理语句
【发布时间】:2014-12-24 04:37:02
【问题描述】:

我正在尝试将值插入 MySQL 数据库。我可能会这样做:

INSERT INTO `records` (`id`, `name`, `town`) VALUES (?, ?, ?)

然后使用准备好的语句来填写相应的值(这将来自用户输入)。

但是,现在假设我想从同一数据库中的 another 表中提取一个值...完全独立于用户。例如,假设town 存储在其他地方...

INSERT INTO `records` (`id`, `name`, `town`)
VALUES (?, ?, SELECT `town` FROM `otherTable` WHERE `someColumb`=1)

现在只有 idname 由 PHP 准备好的语句提供。

我看到了一些关于使用SELECTUNION ALL 的帖子,但我无法正确实现它(这也不起作用):

INSERT into `records`
(`period`, `fullname`, `username`, `inout`, `outWhere`)
"SELECT `value` from `settings` WHERE `name`='CURRENT_PERIOD', ?, ?, ?, ?

我想自动填充第一个值period,但最后四个应该来自准备好的语句。

非常感谢 - 我还在学习 MySQL 语法。

【问题讨论】:

  • 我不确定问题出在哪里。您只需按照通常编写的方式编写 SQL 查询,然后将所有用户提供的数据部分替换为 ? 占位符以及您通过准备好的语句输入的值。准备好的语句不关心查询的整体复杂程度,也不关心是否涉及多个表。
  • 我是这么想的……但最后一条语句不起作用。
  • 最后一条语句缺少 VALUES 关键字和值周围的括号。
  • 我在重新阅读手册页后撤回了之前的答案。但看在老天的份上,找出错误(根据php.net/manual/en/mysqli.error-list.php)并查看它们!
  • 好建议;会的。

标签: php mysql prepared-statement sql-insert


【解决方案1】:
"INSERT into `records`
(`period`, `fullname`, `username`, `inout`, `outWhere`)
SELECT `value`, ?, ?, ?, ? from `settings` WHERE `name`= ?";

然后用bind_param绑定参数

【讨论】:

    【解决方案2】:

    OP 这里...虽然接受的答案更好,但我只是想在这里记录我的发现:

    以下应该可以将多个表“连接”在一起:

    SELECT table1.*, table2.*, ?, ?, ?
    FROM table1, table2
    WHERE table1.col1="something" AND table2.col2="anotherthing";
    

    然后可以将此语句与准备好的INSERT 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多