Php MySql数据库查询在我使用时不起作用\u GET inside

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初学者

我有下面的脚本,如果我在查询中不使用_GET['version'],它可以工作,但是如果我删除它,它可以工作。没有错误;我不知道为什么它不起作用

<?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']]);