2015-02-09 97 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前,但很有趣。至少我今天學到了一些新東西:)