Php 从数据库中选择数据后出错
我目前正在一个论坛网站上工作,该网站有一个upvote系统。然而,有一些恼人的,可能是语法错误困扰着我。我说的是这段代码Php 从数据库中选择数据后出错,php,mysql,pdo,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
<?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'");
您的代码有错误,特别是代码用户id='$\u会话['u\u id']'
,请尝试以下操作:
$sql1 = $conn->prepare("SELECT * FROM users
WHERE user_id = '{$_SESSION['u_id']}' AND thread_id = '$thread_id'");
要在字符串中插入数组键,如果在'
警告直接在查询中插入$\u会话
contenst,您将有资格使用
插入它们的正确且更好的方法是按如下方式绑定每一个:
$sql1 = $conn->prepare("SELECT * FROM tableName WHERE fieldID = :id");
$sql1->bindParam(':id', $_SESSION["id"]);
似乎报价有问题,试试下面的方法
$uid = $_SESSION['u_id'];
$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = '$uid' AND thread_id = '$thread_id'");
我被这些提供答案的人深深地触动了,他们的答案仍然对注射敞开大门。把他事先准备好的声明改成安全的声明有那么难吗
这里有一个正确的解决方案。好像重写它需要那么长时间。这应该违反这里的规定
<?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();
哪一行号是9?请访问并了解SQL注入以及如何使用准备好的语句。现在你的代码真的很容易被注入,你的整个数据库可能在几秒钟内被入侵!!!还要注意的是,您的代码对SQL注入非常开放,因此要准备好迎接更多的错误和问题。如果您打算以同样的方式转储变量,那么准备语句就没有多大意义了。@WillemvanderSpek-这就是精神:D是的,您应该;)可爱的是,每个人仍然提供不安全的答案。天哪。。。。或者绑定参数@CD001你可以省略or:-)@CD001我不明白人们怎么还能提供这样的例子。。。问题是,99%在这里提问的人根本不关心如何编写正确的准备好的语句,因为他们有一个糟糕的代码示例,但它是有效的。所以他们不在乎。提供这样的例子应该是违反规则的。注射是一个巨大的问题,预防注射是很容易的。感谢你在回答中提到他们需要绑定参数,至少还有一些人理解它!!!:)请考虑删除/编辑您的答案,以告知读者,这将添加一个众所周知的安全漏洞到他们的应用程序/网站/服务器!!!有正确和安全的答案给这个问题,你的主题是使读者100%可黑客!!!!!!。。。或者绑定参数!当然,请考虑删除/编辑您的答案,以告知读者,这将添加一个众所周知的安全漏洞到他们的应用程序/网站/服务器!!!有正确和安全的答案给这个问题,你的主题是使读者100%可黑客!!!!!!!安全地不是100%。。。不管怎样,我插入了警告。@user2342558谢谢,伙计:)sry为延迟重播…有什么理由使用bindParam而不是bindValue吗<代码>与PDOStatement::bindValue()不同,该变量被绑定为引用,仅在调用PDOStatement::execute()时进行计算。
希望这能有所帮助。如果您还有更多问题,请随时提问:)