2010-10-14 174 views
0

PHP:問題與MySQL和PHP

<?php 
if (isset($_POST['name'])){ 
mysql_connect("localhost", "db", "test") or die(mysql_error()); 
mysql_select_db("db") or die(mysql_error()); 
$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'"); 
echo $tmp[0]; 
} 
else 
{ 
?> 
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> 
<input name="name" type="text"> 
<input type="submit" name="submit" value="submit" > 
</form> 
<?php 
} 
?> 

MYSQL:

CREATE TABLE IF NOT EXISTS `Channels` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(30) NOT NULL, 
    `commercial` tinyint(1) NOT NULL DEFAULT '0', 
    `usrid` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

-- 
-- Daten für Tabelle `Channels` 
-- 

INSERT INTO `Channels` (`id`, `name`, `commercial`, `usrid`) VALUES 
(2, 'TEST', 0, 0); 

如果我在輸入寫測試將在$ TMP [0]爲空

請幫助

+0

$ tmp [0]永遠不會包含任何明智的東西。先閱讀'mysql_query()'手冊頁。和mysql_real_escape_string()頁面 – 2010-10-14 18:40:10

回答

2

問題是與您的查詢:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'"); 

當你要在一個字符串包含一個數組項,你需要它括在大括號:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='{$_POST['name']}'"); 

但是不要做這個。 這個查詢是非常不安全的,並且開放給SQL注入。首先確保magic_quotes_gpc在您的PHP配置中設置爲關閉(這是不安全和不可靠的 - 您可以使用var_dump(get_magic_quotes_gpc());來確認它是否打開)。然後執行以下操作:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='" . mysql_real_escape_string($_POST[name]) . "'"); 

這將有助於確保您的網站不會受到SQL注入攻擊。

我也鼓勵你看看更現代和安全的數據庫查詢方式,如PDOMySQLi

+1

+1用於提示SQL注入和PDO。它殺了我有多少人仍然在與這個概念奮鬥 – Cfreak 2010-10-14 18:45:02

+0

你的第二個代碼片段有錯誤的語法。去除大括號。 @Cfreak我從來沒有見過任何人被這樣的「建議」所信服。特別是伴隨着舊式的代碼。我甚至懷疑大多數這些人在他們的代碼中不使用PDO。 – 2010-10-14 18:48:31

+0

@Col。我的意思是有多少人在使用SQL注入的概念。 – Cfreak 2010-10-14 18:52:32

1

這裏有混合撇號和引號:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'"); 

應該是:

$tmp = mysql_query('SELECT commercial FROM Channels WHERE name="'.$_POST['name'].'"'); 

編輯:而且,正如其他人所說,這將會是最好關閉Magic Quotes,如果他們啓用,並添加mysql_real_escape_string(),所以:

$tmp = mysql_query('SELECT commercial FROM Channels WHERE name="'.mysql_real_escape_string($_POST['name']).'"'); 

此外,爲了澄清,我從外部引號切換到撇號的原因是變量解析(而不是自己做的工作)增加了一些開銷。

+0

http://ca2.php.net/manual/en/language.types.array.php跳轉到「數組做什麼和不該做什麼」,它指定你不應該摺疊數組元素'名稱'沒有它是一個字符串文字。 – Incognito 2010-10-14 18:51:22

+0

@ user257493:非常真實。其實,我甚至不知道你能*引用這樣的關鍵。 – JKS 2010-10-14 18:55:44

0
  1. 你有一個語法錯誤:
    $tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'");

你可能想:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='" . $_POST['name'] ."'"); 

否則,如果您的名字是 「某些事情」 你問MySQL的」。有些事情。」 (也不要使用,因爲我已經寫好了該查詢,這是一個安全問題,見下文)

  1. $tmp不是一個數組它應該是一個結果。您需要撥打mysql_fetch_*函數中的一個來獲得結果。您還應該使用mysql_error()來檢查錯誤,以確保查詢成功。例如:

    if(!mysql_error()){ $ row = mysql_fetch_row($ tmp); //對數據行做某事 }

  2. 寫入的查詢是一個安全問題。有人可以用它來接管你的數據庫並做他們想做的任何事情。使用mysql_real_escape_string()來避免:

    $ tmp = mysql_query(「SELECT commercial FROM Channels WHERE name ='」。mysql_real_escape_string($ _ POST ['name'])。「'」);

+0

我的代碼現在:$ tmp = mysql_query(「SELECT commercial FROM Channels WHERE name ='{$ _ POST ['name']}'」); ($ row = mysql_fetch_row($ tmp)) { echo $ row ['name']; } //但支出是空的,應該是0 – hanswurst 2010-10-14 19:06:23

+0

請注意我對安全問題所說的話。還要檢查mysql_error()以確保查詢成功。如果這不起作用。檢查你的數據 – Cfreak 2010-10-14 20:06:00