Проблемы для вставки данных в MySQL с PDO - PullRequest
0 голосов
/ 30 июня 2018

Я делаю Crawler с php, и этот 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
  ]);

но у меня есть некоторые проблемы с добавлением заголовка в базу данных, это ошибка:

Неустранимая ошибка: необработанное исключение PDO: 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 голосов
/ 30 июня 2018

Вы неправильно используете подготовленные заявления. Чтобы быть эффективным, вам нужно использовать заполнитель вместо значения.

$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;
...