【问题标题】:update the session field in database更新数据库中的会话字段
【发布时间】:2013-03-27 20:22:07
【问题描述】:

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

为什么它只有 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语句中,**将其视为列NAME**不是我想要的!)”

我在 CREATE 语句中尝试了一些 TYPE,并且还尝试了 UPDATE 语句的许多语法(一切!!!),但它总是给出这个错误。

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

CAST() 声明对我有帮助吗?

希望您能帮我解决这个问题...并可能在PHP 中列出此类问题的一些真实参考?

非常感谢!!

【问题讨论】:

    标签: php sql database types field


    【解决方案1】:
    $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,以便解析器知道什么是字符串以及什么列名。如果没有 ' 的解析器,则假设您正在陈述一列。

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

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

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

    【讨论】:

    • 请问几个问题:1.数组变量的索引应该用“或'引用?或者关于“是一个字符串”,两者都可以根据情况使用吗?2.你能为我解释一下 '".$_SESSION["sid"]."' 之类的东西是由 php executor 解决的,因为我仍然无法完全弄清楚;为什么需要最外面的两个?将两个 [dot] 放在变量周围?3. 反引号的工作原理是什么?当用于引用 [table_name] 时它是如何工作的?4. 像 $sql="[bla's]" 这样的 sql 语句必须有 ; 在[bla's] 的结尾?但 SELECT 和 SHOW 没有?它是什么?
    • 1. ' 和 " 索引都可以正常工作 2. 在 SQL 查询中:您通常以 " 开头,以开始一个 php 字符串。这使得使用 ' 作为 SQL 字符串变得很容易。现在,我们需要 ' 开始 SQL 字符串," 结束 php 字符串, . 向字符串添加内容, . 添加字符串, " 开始字符串, ' 结束 SQL 字符串; 3.我想你问为什么你需要用“或'来索引。这是因为如果你不指定为字符串,php会检查没有$的常量。4.技术上你不需要;在SQL中查询。但是用 ; 结束所有查询也是一个很好的做法。希望这会有所帮助。
    【解决方案2】:

    至于更新语句,很明显缺少撇号。当您想将字符串值插入数据库时​​,您总是需要撇号。此外,您应该使用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 的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2017-07-22
      • 1970-01-01
      相关资源
      最近更新 更多