我是一名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
请注意,版本列确实在表
中退出答案 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所述:
[ 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']]);