2013-04-05 48 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

相关问题