2015-02-09 43 views
-1

我知道这个问题已经被问过许多次了......我在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

我真的不知道该怎么办了...... 感谢您的帮助!

+0

什么是*整个*错误信息? – 2015-02-09 18:37:38

+3

不要从数据中构建SQL语句。使用预准备的语句http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – 2015-02-09 18:41:23

+0

你应该转义数据库条目,并且你的错误来自于'它里面的退出sql的。 http://php.net/manual/en/mysqli.real-escape-string.php或@AndyLester说。 – 2015-02-09 18:42:01

回答

2

最好的解决办法是使用准备好的查询:

$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他们代入查询之前逃脱的变量。

0

我终于看了其他的方法,最后工作。我改变了我解析链接的方式,也许这是关键?

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前,但很有趣。至少我今天学到了一些新东西:)