将html标记解析为pdo mysql

4si2a6ki  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(281)

我的代码使用regex解析html标记,并将所有链接作为数组存储在数据库中
我的代码中有一个问题,我不知道如何修复它来保存mysql中的链接
我看到这个错误消息error: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;
vi4fp9gy

vi4fp9gy1#

绑定参数时,需要指定 : 在参数名称中:

$stmt->bindParam(':' . $search_field, $search_val);

您将得到一个错误,因为它丢失了,代码返回到期望一个整数值来指示参数位置(就像您使用的是?—样式的参数一样)。
注意文档中对pdostatement::bindparam()的第一个参数的描述。

参数

参数标识符。对于使用命名占位符的准备语句,这将是形式为:name的参数名称。对于使用问号占位符的准备语句,这将是参数的1索引位置。

ipakzgxi

ipakzgxi2#

将数据传递给prepared语句的方式不正确,您使用了数组的索引—这是一个基于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 = array();
foreach($matches as $match) {
    $url[]=$match[2];
}

相关问题