我有一个数据库。我在数据库中创建了一个只包含一行的表,如果它之前没有被构造的话。
为什么它只有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检查INSERT
或UPDATE
之后的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
的列。