我有一个数据库。我创建了一个只包含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 field
或INSERT
之后的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
中列出这个问题的真实参考?
非常感谢!!
答案 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
的列,用于条目序列。