更新数据库中的session字段


update the session field in database

我有一个数据库。我在数据库中创建了一个只包含一行的表,如果它之前没有被构造的话。

为什么它只有1行,因为我只是用它来保存一些信息。

有一个字段的TYPE NVARCHAR(100),我想用它来存储会话id,让我头疼的是:

似乎我甚至不能正确地插入(我使用phpmyadmin来检查,它是空白的)和更新(语法错误…)它与从session_id()获得的会话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检查INSERTUPDATE之后的sid field它是空白;

但是如果我这样做:

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

echo $vector[sid],然后打印在网页上。

另一个问题是:

对于上面的UPDATE语句,我总是得到这样的错误:

"未知列xxxxxx....(一些会话id返回,它似乎总是翻译它第一并把它放在SQL语句,**把它作为一个列名称**这不是我想要的!)"

我在CREATE语句中尝试了一些TYPE,也尝试了很多UPDATE语句的语法(所有的!!),但它总是给出这个错误。

我正在处理'和字符串表示的问题,其中包含一个变量,后者的值实际上是我想要的…也许问题产生于类型在CREATE和UPDATE语句中的字符串表示?

CAST()语句对我有帮助吗?

希望你能帮我处理这个…并可能在PHP中列出一些此类问题的真实参考?

非常感谢!

$insert = "INSERT INTO trans_vector (`sid`, `uamip`, `uamport`) VALUES(
       '".$_SESSION["sid"]."',
       '".$_SESSION["myuamip"]."',
       '".$_SESSION["myuamport"]."'
     )";

这至少可以解决一些警告,如果不能解决错误的话。

and for update…

$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);

或在创建查询时手动转义字符串

对于update语句,很明显缺少撇号。当要向数据库中插入字符串值时,总是需要撇号。此外,您应该使用mysql_real_escape_string。然而,我认为标准的mysql已经被弃用了,并且在PHP的新版本中已经被删除,而支持MySQLi和PDO。因此,你应该尽快切换到mysql或PDO。

在引用$_SESSION中的值时也应该使用撇号。否则,PHP将尝试查找名称为sid的常量,然后退回到字符串'sid'。如果真的定义了一个叫做sid的常量,你就会遇到麻烦了。

这里,mysql库中正确的update语句:

$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的列。