【问题标题】:Split an store SQL Objects in separate tables在单独的表中拆分存储 SQL 对象
【发布时间】:2014-03-19 04:25:47
【问题描述】:

我的 SQL 查询通过以下查询一直给我错误输出。我可以在获取结果的同时设置查询吗?

$con = new connection();
$con = mysql_query("SELECT * FROM object");
while($res = mysql_fetch_array($con)) {

mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'parent_id', '$res[parent_id]');") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'nice_url', '$res[nice_url]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'startpage', '$res[startpage]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'type', '$res[type]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'title', '$res[title]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'menu_title', '$res[menu_title]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'keywords', '$res[keywords]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'description', '$res[description]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'content', '$res[content]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'date', '$res[date]')") or die(mysql_error());
mysql_query("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES ('$res[id]', 'status', '$res[status]')") or die(mysql_error());

}

【问题讨论】:

  • 强制mysql 已贬值,使用mysqli

标签: php sql sql-server


【解决方案1】:

您使用不正确的单引号将列名括起来,您可以使用反引号或不使用反引号。但请确保将任何作为保留关键字甚至表名的列名反引号。

mysql_query("INSERT INTO object_meta 
(`object_id`, `key`, `value`) 
VALUES ('$res[id]', 'parent_id', '$res[parent_id]');") 
or die(mysql_error());

【讨论】:

  • 它解决了我的问题,你能解释一下为什么在我只处理 1 个查询的另一个故障中查询工作正常吗?
  • 您正在使用循环添加数据。因此,在执行循环时,表对象应该具有您在第二组查询中指定的所有列。 PS:您需要更正所有查询以使用反引号,而不仅仅是第一个。
【解决方案2】:

您的代码对 sql 注入不安全。您也将从切换到 PDO 然后 mysql 功能中受益。您创建一次插入语句,然后将值绑定到查询。这也可以保护您免受 sql 注入,而无需添加任何代码。

<?php
$pdo = getpdoconnection();
$data = $pdo->query('SELECT * FROM object');

$statement = $pdo->prepare("INSERT INTO object_meta ('object_id', 'key', 'value') VALUES (?, ?, ?)");
while($res = $data->fetch(PDO::FETCH_ASSOC)) {
    $statement->execute(array($res['id'], 'parent_id', $res['parent_id']));
    $statement->execute(array($res['id'], 'nice_url', $res['nice_url']));

    //.....
}

PDO 教程

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多