Мой код анализирует HTML-теги с помощью регулярного выражения и хранит все ссылки в виде массива внутри базы данных.
У меня проблема в моем коде, я не знаю, как ее исправить, чтобы сохранить ссылки внутри MySQL
я вижу это сообщение об ошибке Ошибка: SQLSTATE [HY093]: недопустимый номер параметра: столбцы / параметры начинаются с 1
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$domain = "https://google.com";
$input = @file_get_contents($domain) or die("Could not access file: $domain");
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)</a>";
if (preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$url=$match[2];
// $match[2] = link address
// $match[3] = link text
}
}
$rows = array($domain, $url);
$stmt = $conn->prepare("INSERT INTO linkss(id, domain, url)
VALUES (NULL, :domain, :url)");
foreach($rows as $key => $value){
$stmt->bindParam($key, $value);
}
$stmt -> execute();
echo "New records created successfully";
}
catch(PDOException $e){
echo "Error: " . $e->getMessage();
}
$conn = null;






При привязке параметра необходимо указать : в имени параметра:
$stmt->bindParam(':' . $search_field, $search_val);
Вы получаете сообщение об ошибке, потому что это отсутствует, и код возвращается к ожиданию целочисленного значения для указания позиции параметра (как если бы вы использовали параметры? -Стиля).
Обратите внимание на это описание первого параметра для PDOStatement :: bindParam () из документации.
Parameters
Parameter identifier. For a prepared statement using named placeholders, this will be a parameter name of the form :name. For a prepared statement using question mark placeholders, this will be the 1-indexed position of the parameter.
Вам нужно указать :, иначе он не распознает параметр
Пожалуйста, проверьте stackoverflow.com/questions/9778887/…
Это просто неправильно. Именованные заполнители можно указывать без двоеточия.
Не знал, мне всегда говорят добавить двоеточие
То, как вы передаете данные в подготовленный оператор, неверно, вы используете индекс для массива, который представляет собой массив с числовым индексом на основе 0. Вот почему вы получаете ошибку. Хотя не уверен, зачем вам этот массив ...
$rows = array($domain, $url);
Вместо этого я бы предложил использовать ...
$stmt = $conn->prepare("INSERT INTO linkss(id, domain, url)
VALUES (NULL, :domain, :url)");
foreach($url as $value){
$stmt->bindParam(':domain', $domain);
$stmt->bindParam(':url', $value);
$stmt -> execute();
}
Это также должно вставить запись для каждого URL-адреса, а не для последнего, поскольку execute() находится внутри цикла.
Обновлять:
Вам также необходимо изменить код, который формирует список URL-адресов, это ранее постоянно перезаписывало последний URL-адрес, это создаст список всех URL-адресов ...
$url = array();
foreach($matches as $match) {
$url[]=$match[2];
}
я удалил $ rows = array ($ domain, $ url); и использовал ваш код, но теперь вижу еще одну ошибку. Предупреждение: недопустимый аргумент для foreach () в /home/ddd/public_html/links.php в строке 27
Это необязательно и не проблема.