Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库中选择数据后出错_Php_Mysql_Pdo - Fatal编程技术网

Php 从数据库中选择数据后出错

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

我目前正在一个论坛网站上工作,该网站有一个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'");

您的代码有错误,特别是代码
用户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()时进行计算。
希望这能有所帮助。如果您还有更多问题,请随时提问:)