来自html页面的解析文本的SQL语法错误
问题描述:
我知道这个问题已经被问过许多次了......我在PHP和Mysql中有基础知识。我正在尝试设置网页跟踪器。我设法使用md5函数来做到这一点。 我想进一步观察发生了什么变化。 我可以解析网页的链接。我想将其存储在数据库中,以便稍后与同一页面的内容进行比较。来自html页面的解析文本的SQL语法错误
这里是我的代码:
$website = "www.example.com"
$input = file_get_contents($website) or die("Could not access file: $website");
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$final .= $match[3] . "<br>";
}
}
$oldchecksum_text = "INSERT INTO websites (website, hash, text) VALUES ('$website', '$newchecksum', '$final')";
if (mysqli_query($conn, $oldchecksum_text)){
echo "New record created successfully";
} else {
echo "Erreur: " . "<br>" . $conn->error;
}
基本上,一切工作...除了SQL查询失败,因为一个“上线1语法错误”的。 问题来自解析的文本。如果我用一个字或一长串字母来替换变量,它可以很好地工作。
我试图用`
替换'
......没有改变任何东西。
这里是我的SQL行的特点: 文/ LONGTEXT/utf8_general_ci
我真的不知道该怎么办了...... 感谢您的帮助!
答
最好的解决办法是使用准备好的查询:
$oldchecksum_text = "INSERT INTO websites (website, hash, text) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($conn, $oldchecksum_text);
mysqli_stmt_bind_param($stmt, "sss", $website, $newchecksum, $final);
if (mysli_stmt_execute($stmt)) {
echo "New record created successfully";
} else {
echo "Erreur: <br>" . $conn->error;
}
如果有某种原因,你不能做到这一点,使用mysqli_real_escape_string
他们代入查询之前逃脱的变量。
答
我终于看了其他的方法,最后工作。我改变了我解析链接的方式,也许这是关键?
function getLinks($link)
{
/*** return array ***/
$ret = array();
/*** a new dom object ***/
$dom = new domDocument;
/*** get the HTML (suppress errors) ***/
@$dom->loadHTML(file_get_contents($link));
/*** remove silly white space ***/
$dom->preserveWhiteSpace = false;
/*** get the links from the HTML ***/
$links = $dom->getElementsByTagName('a');
/*** loop over the links ***/
foreach ($links as $tag)
{
$ret[$tag->getAttribute('href')] = $tag->childNodes->item(0)->nodeValue;
}
return $ret;
}
/*** a link to search ***/
$link = $website;
/*** get the links ***/
$urls = getLinks($link);
/*** check for results ***/
if(sizeof($urls) > 0)
{
foreach($urls as $key=>$value)
{
$final .= $key . '<br >';
}
}
else
{
echo "No links found at $link";
}
$oldchecksum_text = "INSERT INTO websites (website, hash, text) VALUES ('$website', '$newchecksum', '$final')";
mysqli_set_charset($conn, "utf8");
$final = mysqli_real_escape_string($conn, $final);
echo $final;
$stmt = mysqli_prepare($conn, $oldchecksum_text);
mysqli_stmt_bind_param($stmt, "sss", $website, $newchecksum, $final);
if (mysqli_stmt_execute($stmt)) {
echo "New record created successfully";
} else {
echo "Erreur: <br>" . $conn->error;
}
感谢您的帮助,我从来没有听说过mysqli_real_escape_string
前,但很有趣。至少我今天学到了一些新东西:)
什么是*整个*错误信息? – 2015-02-09 18:37:38
不要从数据中构建SQL语句。使用预准备的语句http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – 2015-02-09 18:41:23
你应该转义数据库条目,并且你的错误来自于'它里面的退出sql的。 http://php.net/manual/en/mysqli.real-escape-string.php或@AndyLester说。 – 2015-02-09 18:42:01