当我在里面使用_GET时,MySql数据库查询无法正常工作

时间:2014-04-20 21:22:26

标签: php mysql

我是一名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();
    }    

?>

我想访问这样的页面

 http://www.mydomain/records.php?version=1.2

请注意,版本列确实在表

中退出

5 个答案:

答案 0 :(得分:1)

您可以通过正确准备语句来尝试避免一些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 :(得分:0)

这不起作用,因为您尝试在字符串中访问$ _GET [&#39; version&#39;]数组变量

"SELECT * FROM $table_name where version = $_GET['version']", PDO::FETCH_ASSOC

在变量周围放置{}将解决这个问题       $ stmt = $ conn-&gt; query(&#34; SELECT * FROM $ table_name where verion = {$ _GET [&#39; version&#39;]}&#34;,PDO :: FETCH_ASSOC);

但是你应该在将它正确放入sql语句之前清理这个值

答案 2 :(得分:0)

也许版本不是整数因此需要引用?

"SELECT * FROM $table_name where verion = '".$_GET['version']."'",

无论如何,你很容易受到sql注入和滥用PDO的攻击

你至少应该使用bindParam / bindValue

或者使用execute()并超过$ _GET值

答案 3 :(得分:0)

您的查询中有verion而不是version。你也没有传递$_GET['version']的值,你将字符串“$ _GET ['version']”传递给查询。将您的查询更新为:

$stmt = $conn->query("SELECT * FROM $table_name where version = {$_GET['version']}", PDO::FETCH_ASSOC);

在花括号("")中包装一个双引号字符串({})内的变量会计算变量的值。

如果你这样做,你将对SQL injection attacks敞开大门。确保在运行查询之前清理变量,或者更好地考虑prepared statements

答案 4 :(得分:0)

正如Variable parsing所述:

  

语法有两种:simple一种,complex一种。

[ deletia ]
     

示例#8简单语法示例

[ 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']} ..."

,你不应该在这里做任何事情。您应该使用参数化语句来prevent SQL injection attacks

$stmt = $conn->prepare("SELECT * FROM $table_name WHERE verion = ?");
$stmt->execute([$_GET['version']]);