0

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

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

有一个字段TYPE NVARCHAR(100)我想用它来存储 session id,这让我很头疼:

似乎我什至无法正确地插入(我phpmyadmin用来检查,它是空白的)和更新(语法错误...)它使用从 获得的会话 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 fieldafterINSERTUPDATE时,它是空白的

但如果我这样做:

$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

非常感谢!!

4

2 回答 2

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

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

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

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

于 2013-04-05T12:31:21.063 回答
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为条目序列调用的列。

于 2013-04-05T12:37:46.310 回答