从数据库

时间:2018-01-24 10:14:33

标签: php mysql pdo

我目前正在一个有upvote系统的论坛网站上工作。然而,有一些烦人的,可能是语法错误,这些错误让我烦恼。我在谈论这段代码。

<?php
session_start();

include_once 'dbh_discussion.inc.php';
$conn = db_discussion_connect();

$thread_id = $_POST['upvote'];

$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = '$_SESSION['u_id']' AND thread_id = '$thread_id'");

这段代码中不清楚的事情如下:

  • db_discussion_connect()在dbh_discussion_connect.inc.php中声明的函数。此功能返回一个连接到我的数据库的新PDO。
  • 指数&#39; upvote&#39;是另一个php文件中按钮的名称,它将调用上面的代码。
  • $ _ SESSION [&#39; u_id&#39;]是一个会话变量,将在用户登录网站时分配。

我在服务器上调试时遇到的错误:

  

解析错误:语法错误,意外&#39;&#39; (T_ENCAPSED_AND_WHITESPACE),   期待&#39; - &#39;或标识符(T_STRING)或变量(T_VARIABLE)或   /var/www/html/includes/thread_upvotes.inc.php中的数字(T_NUM_STRING)   第9行

我觉得我错过了一些语法上的东西。无论如何,我真的很感激有人告诉我这里出了什么问题。

由于

3 个答案:

答案 0 :(得分:3)

我被这些人提供了如此强烈的触发,他们提供了对注射仍然很开放的答案。是否难以将他准备好的陈述改为安全的东西?!!!

这是一个具有正确准备语句的解决方案。好像重写它需要很长时间。这应该违反这里的规则。

<?php
session_start();

include_once 'dbh_discussion.inc.php';
$conn = db_discussion_connect();

$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = :uid AND thread_id = :tid");
$sql1->bindParam(':uid', $_SESSION["u_id"]);
$sql1->bindParam(':tid', $_POST['upvote']);
$sql1->execute();

答案 1 :(得分:1)

您的代码有错误,特别是代码user_id = '$_SESSION['u_id']',请尝试以下操作:

 $sql1 = $conn->prepare("SELECT * FROM users 
 WHERE user_id = '{$_SESSION['u_id']}' AND thread_id = '$thread_id'");

要在字符串中插入数组键,如果在{ }中指定了键,则必须将其括在' '

警告直接在查询中插入$_SESSION,您有资格获得SQL Injection !!!

插入它们的正确和更好的方法是将每个像这样绑定:

$sql1 = $conn->prepare("SELECT * FROM tableName WHERE fieldID = :id");
$sql1->bindParam(':id', $_SESSION["id"]);

答案 2 :(得分:0)

似乎引用了问题,请尝试如下,

$uid = $_SESSION['u_id'];
$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = '$uid' AND thread_id = '$thread_id'");