【问题标题】:Json to MySQL Query Error when executing manually it works [duplicate]手动执行时Json到MySQL查询错误[重复]
【发布时间】:2018-11-14 19:28:12
【问题描述】:

Json 到 MySQL 运行时可以很好地导入数据库。 当我手动运行 SQL 查询时,它运行时没有错误。

当我通过代码运行它时,它在我的第 1 行附近的 SQL 语法中返回错误。

我已经删除了魔术引号,仍然有错误。 在我扔下毛巾之前,有人能对此有所了解吗?

我知道魔术引号已被弃用,我认为这是导致错误的原因,但这些已被删除。

<?php
/**
 * Created by PhpStorm.
 * User: dave
 * Date: 14/11/2018
 * Time: 15:26
 */

$connect = mysqli_connect("localhost", "root", "password", "clients");
$query = '';
$table_data = '';
$filename = "test.json";

$data = file_get_contents($filename);
$array = json_decode($data, true);

foreach($array as $set)
{
    $tblName = $set['tableName'];
    echo $tblName ;
    if(sizeof($set['rows']) > 0) {
        $query = '';
        $colList = array();
        $valList = array();
        //  Get list of column names
        foreach($set['rows'][1] as $colname => $dataval) {
          // $colList[] = "`".$colname."`";
           $colList[] = $colname;
        }
        $query .= "INSERT INTO ".$tblName." \n";
        $query .= "(".implode(", ",$colList).")\nVALUES\n";
        //  Go through the rows for this table.
        foreach($set['rows'] as $idx => $row) {
            $colDataA = array();
            //  Get the data values for this row.
            foreach($row as $colName => $colData) {
                $colDataA[] = "'".$colData."'";
            }
            $valList[] = "(".implode(",",$colDataA).")";
        }
        //  Add values to the query.
        $query .= implode(",\n",$valList)."\n";
        echo "<p>Insert query:<pre>$query</pre></p>";
        $results = mysqli_query($connect, $query);

 //       if ($connect->query($results) === TRUE) {
 //           echo "New record created successfully";
 //       } else {
  //          echo $results . "<br>" . $query . "<br>" ;
 //            echo "error" .$connect->error ;
 //       }

        echo "<h1>".mysqli_num_rows($connect)." Rows appeded in $tblName</h1>";
    } else {
        echo "<p>No rows to insert for $tblName</p>";
    }
}

Json 文件:

[
    {
      "tableName":"contacts",
      "rows":[
        {
          "First_Name": "Dave",
          "Last_Name": "Frank",
          "Company": "Company1",
          "Business_Phone": "0115 999999",
          "Email_Address": "zvv@zz.com"
        },
        {
          "First_Name": "Dave",
          "Last_Name": "Blogs",
          "Company": "Company2",
          "Business_Phone": "0115 888888",
          "Email_Address": "zvv@zz.com"
        },
        {
          "First_Name": "David",
          "Last_Name": "frank",
          "Company": "Company3",
          "Business_Phone": "0115 777777",
          "Email_Address": "zvv@zz.com"
        }
      ]
    },
    {
      "tableName":"contacts_old",
      "rows":[
        {
          "First_Name": "Dave",
          "Last_Name": "Frank",
          "Company": "Company1",
          "Business_Phone": "0115 999999",
          "Email_Address": "zvv@zz.com"
        },
        {
          "First_Name": "Dave",
          "Last_Name": "Blogs",
          "Company": "Company2",
          "Business_Phone": "0115 888888",
          "Email_Address": "zvv@zz.com"
        },
        {
          "First_Name": "David",
          "Last_Name": "frank",
          "Company": "Company3",
          "Business_Phone": "0115 777777",
          "Email_Address": "zvv@zz.com"
        }
      ]
    }
]

这是根据要求的回声:

contacts

Insert query:

INSERT INTO contacts 
(First_Name, Last_Name, Company, Business_Phone, Email_Address)
VALUES
('Dave','Frank','Company1','0115 999999','zvv@zz.com'),
('Dave','Blogs','Company2','0115 888888','zvv@zz.com'),
('David','frank','Company3','0115 777777','zvv@zz.com')

Error: 1
INSERT INTO contacts (First_Name, Last_Name, Company, Business_Phone, Email_Address) VALUES ('Dave','Frank','Company1','0115 999999','zvv@zz.com'), ('Dave','Blogs','Company2','0115 888888','zvv@zz.com'), ('David','frank','Company3','0115 777777','zvv@zz.com')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1contacts_old

Insert query:

INSERT INTO contacts_old 
(First_Name, Last_Name, Company, Business_Phone, Email_Address)
VALUES
('Dave','Frank','Company1','0115 999999','zvv@zz.com'),
('Dave','Blogs','Company2','0115 888888','zvv@zz.com'),
('David','frank','Company3','0115 777777','zvv@zz.com')

Error: 1
INSERT INTO contacts_old (First_Name, Last_Name, Company, Business_Phone, Email_Address) VALUES ('Dave','Frank','Company1','0115 999999','zvv@zz.com'), ('Dave','Blogs','Company2','0115 888888','zvv@zz.com'), ('David','frank','Company3','0115 777777','zvv@zz.com')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1

警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,布尔值在

中给出

【问题讨论】:

  • 当你回显 $query 时,你能展示一下这会产生什么吗?
  • 用数据编辑过的帖子
  • 您执行了两次查询 - $results = mysqli_query($connect, $query);,然后是结果 if ($connect-&gt;query($results) === TRUE) {
  • $results 将被强制转换为1,因为PHP 的松散类型。也就是说,你的做法是错误的,一旦你击中 John O'Malley,一切都会崩溃。
  • 我正在为你准备一个答案。简短版本:准备好的语句。

标签: php mysql json


【解决方案1】:

正如 Nigel 指出的那样,您最初的问题是由将结果集传递给 query() 而不是字符串引起的。我希望由于拼写错误,这个问题将作为题外话关闭,但在此之前我想指出您的代码中存在许多问题和效率低下。

最重要的是,您缺乏准备好的语句和数据清理意味着您的查询将在撇号出现时立即崩溃。我对 mysqli 生疏了,所以我在这里的代码中使用了 PDO,因为我可以做到这一点。无论如何,它是一个更现代的界面,而且不那么冗长。您可以在PDOmysqli 中阅读有关准备好的语句的更多信息,但要记住的重要一点是,您准备好您的语句,使用? 作为您要插入的值的占位符。然后,您执行该语句,将值传入。数据库负责转义任何讨厌的值,并且与在循环的每次迭代中重建整个查询相比,它的开销要少得多。

您还应该考虑使用 PHP 的内置函数(如 array_keysarray_valuesarray_columns)来提取数据,而不是诉诸 foreach 循环。

<?php
$connect = new PDO("mysql:host=localhost;dbname=clients", "root", "password");
$filename = "test.json";

$data = file_get_contents($filename);
$array = json_decode($data, true);

foreach($array as $set)
{
    $tblName = $set['tableName'];
    if(count($set['rows']) > 0) { /* typical to use count() for measuring array size */
        //  Get list of column names
        $colList = array_keys($set["rows"][0]); /* no loop needed */
        $query = "INSERT INTO `$tblName` \n";
        $query .= "(" . implode(", ", $colList) . ")\nVALUES\n";
        $placeholders = implode(",", array_fill(0, count($colList), "?"));
        $query .= "($placeholders)"; /* you should have INSERT INTO xxx (yyy, zzz) VALUES (?, ?) */
        $stmt = $connect->prepare($query);
        if (!$stmt) {
            echo "Prepare error: $query<br/>" . $connect->errorInfo()[2];
            continue; /* give up, go to next record set */
        }
        //  Go through the rows for this table.
        foreach($set['rows'] as $row) {
            $result = $stmt->execute($row); /* hey you can just pass the array directly! */
            if ($result === TRUE) {
                echo "New record created successfully";
            } else {
                echo "Execute error: $stmt->queryString<br/>" . $stmt->errorInfo()[2];
            }
        }
    } else {
        echo "<p>No rows to insert for $tblName</p>";
    }
}

【讨论】:

  • 好极了。尽管为了完整起见,我会补充说,即使出于测试目的,也不应该让应用程序以 root 身份登录数据库。
  • 谢谢 Mike,如果我在示例中使用多个节点,我如何在没有 foreach 的情况下提取值?我一直在尝试不进入另一个 foreach,但我只将值转换为一个节点。我可以通过 foreach 简单地完成此操作,但我正在尝试获取您的信息。我并不太担心数据清理,因为这将成为 CRUD,并且我将在另一端进行清理。
  • 我对你如何传递值感到困惑。我从不使用 PDO。经过一些阅读,我能够让它工作。我需要这些值在 foreach 中传递。所以 $row = array_values($row);就在执行之前谢谢
  • 对,我忘了你从你的 JSON 中得到了一个关联数组,很抱歉。 array_values() 正是要使用的工具。
  • 是的,循环仍然是遍历不同表及其行的最简单方法。 foreach 没什么问题,只是在查看数十次迭代时最好避免使用它们,并且可以使用非常好的函数!
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 2014-03-18
  • 2018-06-07
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多