更新数据库中的会话字段

时间:2013-04-05 12:09:15

标签: php sql database types field

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

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

我要将TYPE NVARCHAR(100)字段用于存储会话ID , 这对我来说很头疼:

似乎我甚至无法正确INSERT(我使用phpmyadmin检查并且它是空白的)和UPDATE(语法错误...)它具有从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检查sid fieldINSERT之后的UPDATE时,空白;

但如果我这样做:

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

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

另一个问题是

使用上面的UPDATE语句,我总是会收到这样的错误:

“未知列xxxxxx ....(某些会话ID返回,它似乎总是将其翻译为第一并将其放入SQL语句中,**将其视为列名NAME **即不是我想要的!)“

我在CREATE语句中尝试了一些TYPE,还有UPDATE语句的大量语法(一切!!!)但总是会出现此错误。

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

CAST()声明应该对我有用吗?

希望你能帮助我解决这个问题......并且可能会在PHP中列出这个问题的真实参考?

非常感谢!!

2 个答案:

答案 0 :(得分:2)

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

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

这应该至少解决一些警告,如果不是错误的话。

和更新......

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

关于您的代码的说明: 必须使用运算符''将数组值放入字符串中。并且不能直接插入。数组索引必须是字符串(注意“)或整数。

列名称应该在它们周围。要使用SQL插入字符串,必须将字符串放入's',因此解析器知道什么是字符串和什么列名。没有''s解析器假设你正在说明一个列。

对于mysql_escape_string,我假设你在将数据存储到会话之前处理它。没有这些,您可能会得到不需要的SQL注入。如果您没有这样做,您可以这样做(在创建查询之前):

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

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

答案 1 :(得分:0)

至于更新声明,很明显缺少撇号。当您想要将字符串值插入数据库时​​,总是需要撇号。此外,您应该使用mysql_real_escape_string。 但是,我认为标准mysql已被弃用,并且已在较新版本的PHP中删除,转而使用MySQLi和PDO。因此,您应该尽快切换到MySQLi或PDO。

在引用$_SESSION中的值时,您还应该使用撇号。否则,PHP将尝试查找名为sid的constanst,然后回退到字符串'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的列,用于条目序列。