2013-04-05 26 views
0

我有一個數據庫。如果以前沒有構建過,我創建了一個只包含DB中一行的表。更新數據庫中的會話字段

爲什麼它只有一行是我只是用它來保存一些信息。

有,我想用它來存儲會話ID, 的TYPE NVARCHAR(100)一個領域,下面就是我的頭痛對我來說:

看來,我甚至不能正確地插入(我用phpmyadmin檢查並且它是空白的)和UPDATE(語法錯誤...),其會話ID從session_id()獲得,其作爲string返回。

下面是有關我的代碼的部分,以我的行動:

//uamip,uamport is in URL;I use $_GET[] 

$_SESSION[uamport] = $_GET['uamport']; 

$_SESSION[uamip] = $_GET['uamip']; 

**$_SESSION[sid] = session_id();** 

//construct 

$sql="CREATE TABLE trans_vector(

     `index` INT NOT NULL AUTO_INCREMENT, 
     `sid` NVARCHAR(100), 
     `uamip` CHAR(15), 
     `uamport` INT, 
     PRIMARY KEY (`index`) 
    )" ; 

mysql_query($sql); 

//insert(first time, so not constructed) 

$sql="INSERT INTO trans_vector (sid,uamip,uamport) VALUES(

     '$_SESSION[sid]', 
     '$_SESSION[myuamip]', 
     '$_SESSION[myuamport]' 
    )"; 

mysql_query($sql); 

//update(from 2nd time and later, table exists, so I want to update the sid part) 

$sql="UPDATE trans_vector SET sid="**.**$_SESSION[sid]; 

mysql_query($sql) 

現在,當我用phpmyadmin檢查sid fieldINSERTUPDATE後是空白;

但是,如果我這樣做:

$vector=mysql_fetch_array(mysql_query("SELECT TABLES LIKE 'trans_vector'")); 

echo $vector[sid],那麼它的印刷上的網頁。

另一個問題是

通過上面的UPDATE說法,我總是得到這樣的錯誤:

「未知列XXXXXX ......(有些會話ID返回,似乎它總是把它翻譯第一,並把它的SQL語句,**把它當作一個列名**,這不是我想要的!)」

我嘗試了一些類型在CREATE語句,也地段UPDATE語句的語法(一切!!!)但我總是給這個錯誤。

我遇到了'和包含變量的字符串表示形式,其中後者的值實際上是我想要的......也許問題出現在CREATE語句中,並且在UPDATE語句中出現字符串表示形式?

應該CAST()聲明對我有幫助嗎?

希望你能幫助我解決這個問題......並且可能會在PHP列出一些此類問題的真實參考?

非常感謝!

回答

2
​​

這應該至少解決一些警告,如果不是錯誤。

和更新...

$update = "UPDATE trans_vector SET `sid`='".$_SESSION["sid"]."';"; 

注意有關代碼: 數組值必須投入與運營商的字符串「」不能直接插入。數組索引必須是字符串(注意「)或整數。

列名應該在它們周圍。要用SQL插入字符串,必須將字符串放入's中,以便解析器知道什麼是字符串和列名。如果沒有解析器假設你在指定一個列。

對於mysql_escape_string,我假定你在將數據存儲到會話之前處理它。沒有這些,你可能會得到不需要的SQL注入。而如果你沒有這樣做,你可以做到這一點(創建查詢):當您創建一個查詢

foreach($_SESSION as $key => $value) 
    $_SESSION[$key] = mysql_escape_string($value); 

或手動逃避字符串。

+0

非常感謝! – 2013-04-05 17:05:22

+0

請問幾個問題: 1.數組變量的索引應該用「或」或引用「是一個字符串」來引用,兩種情況都可以一個例外地使用嗎? 2.你能否爲我解釋''。$ _ SESSION [「sid」]。「'是由php執行者制定的,因爲我仍然無法完全弄清楚它;爲什麼最後兩個人需要?以及如何合理地將兩個[dot]的變量是什麼? 3.什麼是反向工作?當用於引用[table_name]時它如何工作? 4. SQL語句像$ sql =「[bla's]」必須有;在[bla's]結尾?但是SELECT和SHOW不是?它是什麼? – 2013-04-05 17:41:15

+0

1.'和'索引工作正常 2.在SQL查詢中:你通常以「開頭」開始一個php字符串。這使得它很容易使用'作爲SQL字符串。現在,我們需要「開始SQL字符串」,結束php字符串,。向字符串添加一些內容,。添加字符串,「開始字符串」,結束SQL字符串; 3.我想問你爲什麼需要使用「或」進行索引,這是因爲如果你沒有指定字符串,php會檢查常量,這些常量不需要$ 4.技術上你不需要;在SQL查詢中,但是最好用所有的查詢結束; 希望這會有所幫助 – inzenir 2013-04-06 19:33:05

0

至於更新聲明,顯然缺少撇號。當您想要將字符串值插入數據庫時​​,您總是需要撇號。而且,你應該使用mysql_real_escape_string。 但是,我認爲標準mysql已被棄用,並且已在較新版本的PHP中被刪除,以支持MySQLi和PDO。因此,您應該儘快切換到MySQLi或PDO。

當引用$_SESSION中的值時,您還應該使用撇號。否則,PHP將嘗試找到名稱爲sid的常量,然後回退到字符串'sid'。如果確實有一個名爲sid的常量,則會遇到麻煩。

這裏,MySQL庫修正更新語句:

$sql = "UPDATE trans_vector SET sid='" . mysql_real_escape_string($_SESSION['sid']) . "'"; 

更妙的是:

$sql = "UPDATE `trans_vector` SET `sid`='" . mysql_real_escape_string($_SESSION['sid']) . "'"; 

使用反引號明確的MySQL,這是一個列名。有時你會有SQL名稱中被稱爲保留關鍵字的列名稱。那麼你會需要撇號。一個常見的示例是針對條目序列的名爲order的列。

+0

我知道了 感謝您的提供! – 2013-04-05 17:06:00