Php MySql数据库查询在我使用时不起作用\u GET inside
我是一个php初学者 我有下面的脚本,如果我在查询中不使用_GET['version'],它可以工作,但是如果我删除它,它可以工作。没有错误;我不知道为什么它不起作用Php MySql数据库查询在我使用时不起作用\u GET inside,php,mysql,Php,Mysql,我是一个php初学者 我有下面的脚本,如果我在查询中不使用_GET['version'],它可以工作,但是如果我删除它,它可以工作。没有错误;我不知道为什么它不起作用 <?php // Specify your table name $hostname = 'localhost'; $dbname = 'stats'; $table_name = 'st_stats'; $username = 'test'; $password = 't
<?php
// Specify your table name
$hostname = 'localhost';
$dbname = 'stats';
$table_name = 'st_stats';
$username = 'test';
$password = 'test';
try
{
$conn = new PDO("mysql:host=$hostname;dbname=$dbname",$username,$password);
//By default mode is silent and exception is not thrown. So I it to throw ex
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// If the query is like this no error is given but page shows up blank
$stmt = $conn->query("SELECT * FROM $table_name where version = $_GET['version']", PDO::FETCH_ASSOC);
// This works if uncomment below line instead and comment line above
//$stmt = $conn->query("SELECT * FROM $table_name", PDO::FETCH_ASSOC);
$count = $stmt->rowCount();
echo("<h1>currently $count records</h1>");
}
catch(PDOException $e)
{
echo 'ERROR: ' . $e->getMessage();
}
?>
请注意,版本列确实存在于表中这不起作用,因为您试图在此处访问字符串中的数组变量$\u GET['version']
"SELECT * FROM $table_name where version = $_GET['version']", PDO::FETCH_ASSOC
在变量周围放置{}将解决这一问题
$stmt=$conn->query(“从$table_name中选择*,其中verion={$_GET['version']}”,PDO::FETCH_ASSOC)
但在sql语句中更正该值之前,还应该对其进行清理可能版本不是整数,因此需要引号
"SELECT * FROM $table_name where verion = '".$_GET['version']."'",
无论如何,您很容易受到sql注入和误用PDO的影响
您至少应该使用bindParam/bindValue
或者使用execute()并超过$\u GET值您在查询中使用的是
verion
,而不是version
。您也没有传递$\u GET['version']
的值,而是将字符串“$\u GET['version']”直接传递到查询中。将您的查询更新为:
$stmt = $conn->query("SELECT * FROM $table_name where version = {$_GET['version']}", PDO::FETCH_ASSOC);
将双引号字符串(“
)中的变量用大括号({}
)括起来计算变量的值
如果你这样做的话,你会对我敞开心扉。在运行查询之前一定要对变量进行清理,或者更好地考虑。< P>您可以尝试通过适当地准备语句来避免SQL注入。
$v_term = $_GET['version'];
$query = "SELECT * FROM $table_name where version = :term";
$result = $conn->prepare($query);
$result->bindValue(":term",$v_term);
$result->execute();
此外,如果可以的话,直接从数据库运行该语句,以确保返回记录。除此之外,没有其他方法可以根据您提供给我们的信息对此进行调试。如下所述:
有两种类型的语法:一种是1,另一种是1
也就是说,可以通过以下两种方式之一从双引号字符串中引用关联数组:
// simple - don't quote your keys
"... $_GET[version] ..."
// complex - you may quote your keys, but must surround the expression in braces
"... {$_GET['version']} ..."
然而,您不应该在这里这样做。您应该改为使用参数化语句,以便:
SELECT*FROM$table\u name where verion=$\u GET['version']
你的意思是version
而不是verion
吗?“SELECT*FROM$table\u name where verion='.$\u GET['version'.”,PDO::FETCH\u ASSOC
'可能是正确的,我不确定尝试一下。你需要像这样用大括号括住变量:{$\u GET['version']
如果您这样做,您将非常容易受到SQL注入攻击,因此请务必先验证并清理您的变量。@jk更正了问题中的问题,它是版本,但不适用于此!您将面临最简单的SQL注入漏洞!在将参数注入查询(!!!!)之前,请先转义该参数并验证其格式,或者使用准备好的语句/存储过程。没有任何解释的单行代码不是答案。请注意SQL注入。这是危险的。
[ deletia ]
[ deletia ]
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;
[ deletia ]
[ deletia ]
// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";
// simple - don't quote your keys
"... $_GET[version] ..."
// complex - you may quote your keys, but must surround the expression in braces
"... {$_GET['version']} ..."
$stmt = $conn->prepare("SELECT * FROM $table_name WHERE verion = ?");
$stmt->execute([$_GET['version']]);