2015-07-19 101 views
-1

我在PHP有一个网站。当登录用户访问我网站上的特定网页时,我尝试将会话变量$_SESSION['user_name']存储到mysql数据库。php store会话变量在mysql数据库中

<?php 
$servername = "localhost"; 
$username = "user1"; 
$password = "user1"; 
$dbname = "payment"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
die("Connection failed: " . $conn->connect_error); 
} 
$sql = 'INSERT INTO users 
VALUES ('.$_SESSION['user_name'].')'; 

if ($conn->query($sql) === TRUE) { 
echo "New record created successfully"; 
} else { 
echo "Error: " . $sql . "<br>" . $conn->error; 
} 

$conn->close(); 
?> 

错误消息:

说明:未定义变量:_SESSION在/opt/lampp/htdocs/succes.php第16行

尝试了一串东西,但可以”弄明白了。这里有什么问题?

+0

1.你在哪里开始您的会话发现了什么? 2.请参阅:http://stackoverflow.com/q/11321491/3933332 – Rizier123

回答

0

您需要在脚本的开头呼叫session_start()(在使用任何$_SESSION变量之前)。另外,你需要周围的变量报价在您查询:

$sql = 'INSERT INTO users 
VALUES ("'.$_SESSION['user_name'].'")'; 

请注意,这是安全;你是开放的SQL注入。在您使用需要调用session_start()任何$_SESSION变量

<?php 
$servername = "localhost"; 
$username = "user1"; 
$password = "user1"; 
$dbname = "payment"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 
$sql = 'INSERT INTO users 
VALUES (?)'; 

$stmt = $conn->prepare($sql); 
$stmt->bind_param('s', $_SESSION['user_name']); 

if ($stmt->execute()) { 
    echo "New record created successfully"; 
} else { 
    echo "Error: " . $sql . "<br>" . $conn->error; 
} 

$conn->close(); 
?> 
+0

这是可行的。感谢您让我知道这是易受sql注入。有没有办法避免这种情况? – Fille

+0

@Fille是的,我添加了一些示例代码。 –

+0

谢谢你阅读准备好的声明。非常有帮助! – Fille

0

:相反,你应该使用准备好的语句。

虽然有点话题,但可以看看PDO。它可能比mysqli()慢一点,但支持更多的数据库类型。这里有一篇关于Tuts+的好文章,解释了一些差异,并解释了基本的安全步骤。

如果我能有点偏我创建了一个PHP类为PDO的连接可以在GitHub

+0

谢谢,我会一直关注它。 – Fille