使用PDO在mysql中插入数据的问题

时间:2018-06-30 03:28:09

标签: php mysql pdo prepared-statement bindparam

我正在使用php制作Crawler,并且此Crawler正常工作

<?php 

  $dbHost = 'localhost';
  $dbName = 'invento';
  $dbUser = 'root';
  $dbPass = '';

try {

  $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName","$dbUser", "$dbPass");
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch(Exception $e) {

  echo $e->getMessage();
}


$html = file_get_contents('https://www.google.com');
preg_match('/<title>(.*)<\/title>/i', $html, $title);

$title_out = $title[1];

$sql = "INSERT INTO prueba (title) VALUES ($title_out)";

  $query = $pdo->prepare($sql);

  $result = $query->execute([
    'title' => $title_out
  ]);

但是我在将标题添加到数据库时遇到了一些问题,这是错误的:

  

致命错误:未捕获的PDOException:SQLSTATE [42S22]:找不到列:   1054中“字段列表”中的未知列“ Google”   C:\ xampp \ htdocs \ webcrawler \ php-web-crawler \ index.php:29堆栈跟踪:   #0 C:\ xampp \ htdocs \ webcrawler \ php-web-crawler \ index.php(29):PDOStatement-> execute(Array)#1 {main}被抛出   C:\ xampp \ htdocs \ webcrawler \ php-web-crawler \ index.php第29行

1 个答案:

答案 0 :(得分:0)

您正在滥用准备好的语句。为了有效,您需要使用占位符代替值。

$title_out = $title[1];
$sql = "INSERT INTO prueba (title) VALUES (:title)";
$query = $pdo->prepare($sql);
$result = $query->execute(['title' => $title_out]);

如果使用命名的占位符,还需要将占位符与键匹配。我通常使用未命名的占位符:

$title_out = $title[1];
$sql = "INSERT INTO prueba (title) VALUES (?)";
$query = $pdo->prepare($sql);
$result = $query->execute([$title_out]);

此外,您不应在HTML上使用正则表达式。它可能由于多种原因而破裂。使用解析器会更强大:

$html = file_get_contents('https://www.google.com');
$dom = new domdocument();
$dom->loadHTML($html);
$titleout = $dom->getElementsByTagName('title')[0]->nodeValue;