2010-03-24 65 views
0

什麼錯這個PHP mysql_real_escape_string


Atomic Number Latin English Abbreviation

* check the variables for content */

/*** a list of filters ***/ $filters = array( 'searchtext' => array('filter' => FILTER_CALLBACK, 'options' => 'mysql_real_escape_string'), 'fieldname' => array('filter' => FILTER_CALLBACK, 'options' => 'mysql_real_escape_string') ); /*** escape all POST variables ***/ $input = filter_input_array(INPUT_POST, $filters); /*** check the values are not empty ***/ if(empty($input['fieldname']) || empty($input['searchtext'])) { echo 'Invalid search'; } else { /*** mysql hostname ***/ $hostname = 'localhost'; /*** mysql username ***/ $username = 'username'; /*** mysql password ***/ $password = 'password'; /*** mysql database name ***/ $dbname = 'periodic_table'; /*** connect to the database ***/ $link = @mysql_connect($hostname, $username, $password); /*** check if the link is a valid resource ***/ if(is_resource($link)) { /*** select the database we wish to use ***/ if(mysql_select_db($dbname, $link) === TRUE) { /*** sql to SELECT information***/ $sql = sprintf("SELECT * FROM elements WHERE %s = '%s'", $input['fieldname'], $input['searchtext']); /*** echo the sql query ***/ echo '<h3>'.$sql.'</h3>'; /*** run the query ***/ $result = mysql_query($sql); /*** check if the result is a valid resource ***/ if(is_resource($result)) { /*** check if we have more than zero rows ***/ if(mysql_num_rows($result) !== 0) { echo '<table>'; while($row=mysql_fetch_array($result)) { echo '<tr> <td>'.$row['atomicnumber'].'</td> <td>'.$row['latin'].'</td> <td>'.$row['english'].'</td> <td>'.$row['abbr'].'</td> </tr>'; } echo '</table>'; } else { /*** if zero results are found.. ***/ echo 'Zero results found'; } } else { /*** if the resource is not valid ***/ 'No valid resource found'; } } /*** if we are unable to select the database show an error ****/ else { echo 'Unable to select database '.$dbname; } /*** close the connection ***/ mysql_close($link); } else { /*** if we fail to connect ***/ echo 'Unable to connect'; } } }

其他 { 回聲 '請選擇一個元素'; } ?>

我從phppro.org教程網站得到了這段代碼,我試圖運行它。它給出 警告:mysql_real_escape_string()[function.mysql-real-escape-string]:無法建立到服務器的鏈接。 ... 警告:mysql_real_escape_string()[function.mysql-real-escape-string]:拒絕用戶'ODBC'@'localhost'(使用密碼:否)的訪問....

我去了php.net並查找它「注意:在使用mysql_real_escape_string()之前需要使用MySQL連接,否則會生成級別爲E_WARNING的錯誤,並返回FALSE。如果未定義link_identifier,則使用最後一個MySQL連接。

我的問題是: 1 - 爲什麼他們把單引號mysql_real_escape_string? 2-他們應該先建立一個連接,然後使用$ filter filter語句和mysql_real_escape_string?

+0

SQL注入檢測 – 2010-03-24 22:20:13

+0

@ Col.Shrapnel的內容:不,全filter \ _input \ _array()thingy應該在\ _POST的每個元素上調用real \ _escape \ _string並將結果存儲在$ input中。如果它按預期工作,那麼就不會有sql注入漏洞。 – VolkerK 2010-03-24 22:47:47

+0

@VolkerK那麼是什麼? real_escape_string不是讓你「安全」的魔法。 – 2010-03-24 22:57:29

回答

2

你的問題在這裏不是與mysql_real_escape_string。你的問題在於你沒有連接到服務器。你有一個數據庫'periodic_table'在本地運行你的登錄憑證的'用戶名'和'密碼'嗎?

+0

是的,我也用其他代碼對它進行了測試。 – skyhigh 2010-03-24 22:20:28

+0

在'if(is_resource($ link))之後移動'$ input = filter_input_array(INPUT_POST,$ filters);'' – thetaiko 2010-03-24 22:29:26

+0

人,即使phppro教程也不起作用,所以我猜PRO上沒有人,爲什麼人們會把up教程不起作用。 – skyhigh 2010-03-24 23:46:04

0
  1. 他們使用函數名稱作爲另一個函數的參數。
0

我覺得mysql_real_escape_string需要的連接,所以它知道使用什麼字符集。

也是在PHP中,單引號更快然後雙引號PHP不必處理THR串尋找$ VARNAME等