2011-10-26 58 views
0

我有這段代碼,主要是爲我的網站創建shorurls。但我根本無法讓它工作。你看到有什麼問題嗎?在另一個內部運行一段時間()可以嗎?無法讓PHP代碼工作

$urloriginal = $nt['fecha']."/".$nt['titulolower']; 
mysql_query("SET NAMES 'utf8'"); 
$shortcheck = mysql_query("SELECT * FROM shorturls WHERE urloriginal = '".$urloriginal."' LIMIT 1"); 
while($urlitem = mysql_fetch_array($shortcheck)) { 
    if($urlitem['urloriginal'] != "0") { 
     echo "http://neutronico.com/u/".$urlitem['id']; 
    } else { 
     mysql_close($shortcheck); 
     mysql_query("INSERT into shorturls (urloriginal) VALUES ('$urloriginal')") 
      or die(mysql_error()); 
     $shortget = mysql_query("SELECT * FROM shorturls WHERE urloriginal = '".$urloriginal."' LIMIT 1"); 
     while($urlitem2 = mysql_fetch_array($shortget)) { 
      echo "http://neutronico.com/u/".$urlitem['id']; 
     }; 
     mysql_close($shortget); 
    }; 
}; 

非常感謝。

+3

什麼不行?預期產出是多少?實際輸出是多少? – bos

+0

你不應該使用'mysql-fetch-assoc'嗎? - http://php.net/manual/en/function.mysql-fetch-assoc.php – Smamatti

+0

似乎你需要做一些簡單的調試 – 472084

回答

4

我看到的第一個問題是您在結果集中調用mysql_close() mid-script。刪除呼叫:

mysql_close($shortcheck); 

mysql_close()旨在調用資源鏈接 - 數據庫連接。不在查詢結果資源上。它在腳本退出時被隱式調用,所以除非您有特定的內存要求,否則不需要調用它。我想你打算打電話mysql_free_result(),但這又被稱爲隱式,除非需要管理內存,否則不需要調用它。

後來,刪除此調用,因爲它不關閉MySQL資源鏈接。

mysql_close($shortget); 
+0

你是對的,在他解決這個問題後,他會遇到我所描述的問題,以及你發現的SQL注入的嫌疑。 – stivlo

1

是的,可以嵌套語句。

我最初並沒有發現的主要問題是您在查詢中間關閉了連接,因此刪除了所有mysql_close語句。

但是,解決此問題後,您將面臨另一個問題,因爲您只使用一個MySQL連接,第二個查詢會丟失第一個查詢的所有結果,因此您可能會停在第一行,或者第一次執行else分支。

要使其工作,你可以選擇兩個選項之一:

  • 使用兩個MySQL連接,並指定與$link_identifier參數mysql_query (string $query [, resource $link_identifier ])
  • 運行第一個查詢使用哪一個,救所有結果都會返回一個數組,然後運行其他查詢,這樣查詢就不會重疊。僅當您的桌子不太大時才使用此選項。

邁克爾還建議檢查您的$urloriginal已消毒與mysql_real_escape_string(),或者你面對SQL注入的風險。