2010-02-23 16 views
1

我試圖插入數據庫中的值,並且不被插入的值,這裏是我的代碼有:問題與MYSQL數據庫,值不被插入

$user_name = "username"; 
    $password = "password"; 
    $database = "database"; 
    $server = "localhost"; 
    $db_handle = mysql_connect($server, $user_name, $password); 
    $db_found = mysql_select_db($database, $db_handle); 

    if ($db_found) { 

    $SQL = 'INSERT INTO table (anInt, DomainName, URL, Rank, PageRank, Google, Bing, Boss, IndexedPage, Backlinks) VALUES ($anInt, $Domain, $URL, $Rank, $Pagerank, $Google, $Bing, $Yahoo, $Pages, $backlinks)'; 
    $result = mysql_query($SQL); 
    mysql_close($db_handle); 

    print "Records added to the database"; 

正在打印的記錄添加到數據庫中但是在查看數據庫時什麼都沒有被添加。一些值是雙打,文本和整數。無論如何要調試這個?如果有人問我,我會在帖子中增加更多信息。

當然,我有一個其他聲明,我只是認爲它不相關,因爲它告訴我,記錄添加。

+3

跑掉 - 我們正在進行SQL注入攻擊! http://en.wikipedia.org/wiki/SQL_injection – 2010-02-23 11:42:53

+0

以及我們如何解決這個問題? – user220755 2010-02-23 11:44:06

+1

閱讀維基百科文章並思考。 – 2010-02-23 11:45:17

回答

4

首先,您應該使用mysql_real_escape_string轉義您傳遞給SQL查詢的字符串值。

然後,您應該在您的SQL查詢中圍繞要包含字符串的字段添加引號。


我真的不知道哪些字段是整數,哪些字段是字符串,但你應該使用這樣的事情來建立你的SQL查詢:

// Escape the string data, and make sure integer really contain integers 
$anInt = intval($anInt); 
$Domain = mysql_real_escape_string($Domain); 
$URL = mysql_real_escape_string($URL); 
$Rank = intval($Rank); 
$Pagerank = = intval($Pagerank); 
$Google = intval($Google); 
$Bing = intval($Bing); 
$Yahoo = intval($Yahoo); 
$Pages = intval($Pages); 
$backlinks = intval($backlinks); 

// Build the SQL query, using the "safe" variables 
$SQL = 'INSERT INTO table (anInt, DomainName, URL, Rank, PageRank, Google, Bing, Boss, IndexedPage, Backlinks) 
     VALUES ($anInt, '$Domain', '$URL', $Rank, $Pagerank, $Google, $Bing, $Yahoo, $Pages, $backlinks)'; 

這是假設只有DomainNameURL旨在包含字符串 - 如果需要,您可能必須使用mysql_real_escape_string並在其他字段的值周圍添加引號。


然後,你應該看一看的mysql_query返回值:一個insert查詢,在一個錯誤的情況下,它會返回false

在這裏,如果你的$result變量是false,你應該使用mysql_errormysql_errno:他們會允許你知道發生了什麼樣的錯誤 - 這將有助於您的SQL查詢發現錯誤,例如。


如果這樣不能解決問題,您應該嘗試輸出SQL查詢,然後使用類似phpMyAdmin的方式運行它,以確保無誤。

+0

我們用於雙打什麼? (我的意思是代替intval)?謝謝! – user220755 2010-02-23 11:53:52

+0

對於雙打,我想'floatval'(請參閱http://php.net/floatval)會訣竅 - 這個想法同樣也是要確保變量包含您期望它包含的內容。 – 2010-02-23 11:55:18

1

那麼有與代碼的安全性問題,但解決的一個問題

你是不是在SQL語句中引號引起的字符串值。

2

我不是PHP專家,但我有2個評論。

  1. 你不檢查錯誤(也許mysql_errno()),所以你不知道該記錄是否加入

  2. 我覺得值,如果它們是字符串,應給予像

    '$域'

就是逃脫'字符。

更好的方式是,當然,使用類似

$sql = sprintf("INSERT ... VALUES(%d, '%s', '%s',...)", 
       $anInt, mysql_real_escape_string($Domain), ...); 

如果插入用戶提供的輸入。

2

你可以檢查$結果:

$result = mysql_query($query); 
if (!$result) { 
    print "An error occured: " . mysql_error() . "\n"; 
} 

我的猜測是,你傳遞一個字符串時沒有引號,像這樣:

VALUES (Hello) 

,你應該通過它想:

VALUES ('Hello') 

就像評論者所說的那樣,如果用戶可以控制這些字符串,那麼就會對SQL注入攻擊開放。您可以防止攻擊通過轉義字符串,例如:

$query = sprintf("INSERT INTO table (DomainName) VALUES ('%s')", 
     mysql_real_escape_string($domain_name)); 
2

在SQL查詢,您需要正確enquote字符串,否則會產生一個錯誤。因此,用於在數據庫中存儲非int或非布爾值的所有變量都需要引用值。

另外,你應該確保SQL注入是不是逃避所有值mysql_real_escape_string第一個問題。

2

除了SQL注入錯誤處理是不完整的......

if (!$db_found) { 
    echo "datbase not found."; 
} 
else { 
    $SQL = 'INSERT INTO 
     table 
     (...) 
    VALUES 
     (...) 
    '; 
    $result = mysql_query($SQL, $db_handle); 
    if (!$result) { 
    echo "error: ", mysql_error($db_handle); 
    } 
    else { 
    print "Records added to the database"; 
    } 
} 
mysql_close($db_handle); 

如果查詢導致錯誤的mysql_query()返回FALSE和mysql_error()會告訴你更多有關該錯誤。

0

首先,請注意別人對安全數據庫處理和避免注入的建議。

你的查詢沒有做任何事情的原因可能是你用單引號括起了字符串。在PHP中,單引號將字符串強制爲文字。與使用雙引號不同,變量不會被替換。所以'$foo'代表字符序列'$'.'f'.'o'.'o'。另一方面,"$foo"代表字符串定義時變量$foo包含的字符序列。

您可以使用mysql_error()來捕捉MySQL的大多數問題。即使消息對你沒有幫助,你至少也知道查詢是否被正確解析,即問題出在哪一端。