首页 > 解决方案 > $_SESSION 变量在查询中使用

问题描述

我花了将近两天的时间在这个圈子上转。

我似乎很难在任何查询中使用 $_SESSION 或 $_POST 作为字符串或将它们转换为要使用的字符串。

我正在使用一种简单的哈希方法登录到一个站点。

从脚本中提取是

<?php
session_start();    
echo "******Running Authenticate<br>";
echo "data submitted<br>".$_POST['site_login']."<br>".$_POST['site_password']."<br><br>";
$SiteLogin =  $_POST['site_login']
$_SESSION['site_login'] = $_POST['site_login'];
$_SESSION['site_password'] = $_POST['site_password'];
$_SESSION['session_id'] = session_id();
$_SESSION['Now_val']  = date('Y-m-d H:i:s');
//include 'showallvars.php';
include 'dbconfig.php';
// Prepare our SQL 
if ($stmt = $con->prepare('SELECT site_index, site_password FROM web_sites WHERE site_login = ?')) {
    // Bind parameters (s = string, i = int, b = blob, etc), hash the password using the PHP password_hash function.

    $stmt->bind_param('s', $_POST['site_login']);
    $stmt->execute(); 
    $stmt->store_result(); 
    // Store the result so we can check if the account exists in the database.


if ($stmt->num_rows > 0) {
        $stmt->bind_result($id, $password);
        $stmt->fetch();   

    echo "account exists";   
    }
    else
    {
    header('Location: badindex.php');
    }

if (password_verify($_POST['site_password'], $password)) {
// Verification success! User has loggedin!
echo "password good";

}
else
{
header('Location: badindex.php');
}
}

$_SESSION['loggedin'] = TRUE;


?>

效果很好

但是记录中有另一个字段('site_name')我想结转。这应该很容易!

并且有十几种方法可以做到,例如“标准”示例类似于

$name = $mysqli->query("SELECT site_name FROM web_sites WHERE site_login = 'fred'")->fetch_object()->site_name; 

这工作正常,但无论我如何尝试 - 连接或或......我无法让 $_SESSION['site_login'] 或 $_POST['site_login'] 替换'fred'。似乎添加了空白。

协助还是指导?

标签: sessionstring

解决方案


应该可以像执行以下操作一样简单:

所以:

if ($stmt = $con->prepare('SELECT site_index, site_password 
    FROM web_sites WHERE site_login = ?')) {

变成:

if ($stmt = $con->prepare('SELECT site_index, site_password, site_login 
    FROM web_sites WHERE site_login = ' . $SiteLogin)) {

请注意,直接将 $SiteLogin 解析为查询是不好的做法,因为现在有人可以 SQL 注入并破解您的网站。他们需要做的就是使用您的表单并找出哪个字段负责 $SiteLogin。您需要转义您的 $SiteLogin。假设 Mysqli,它会变成:

if ($stmt = $con->prepare('SELECT site_index, site_password, site_login 
    FROM web_sites WHERE site_login = ' . $con->real_escape_string($SiteLogin))) {

推荐阅读