<?php
$id = $_GET['id'];
$query = "SELECT doc
FROM docs
WHERE id = '$id';";
$doctext = mysql_query($query);
?>
我是PHP / MySQL的新手,不确定出了什么问题。上面的代码应该从URL中获取id,工作正常,然后从表{{1}中选择doc
- 这是与id
列相邻的数据列。 }}匹配给定的docs
值。
然而,它只返回“资源ID#11”,这让我觉得我混淆了$id
,SELECT
和FROM
关键字,因为它是没有给出错误,只是错误的数据。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:6)
您的查询执行正常。您的问题是您没有从结果中检索任何数据。 mysql_query
函数不会自动检索数据,您可以使用mysql_fetch
函数之一以mysql_fetch_row函数的形式检索数据。
请注意真的不应该使用古老的MySQL api,而应该使用PDO(或MySQL)。此外,您的代码易受SQL注入攻击,您应该使用绑定参数,这是MySQLi和PDO的一项功能。
答案 1 :(得分:3)
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare('SELECT doc FROM docs WHERE id = :id');
$stmt->execute(array(':id' => $_GET['id']));
foreach ($stmt as $row) {
var_dump($row);
}
请不要使用mysql_*
函数来编写新代码。它们已不再维护,社区已经开始deprecation process。请参阅red box?相反,您应该了解prepared statements并使用PDO或MySQLi。如果您无法确定哪个,this article会对您有所帮助。如果您选择PDO,here is good tutorial。
答案 2 :(得分:1)
根据所提供的信息,我想指出一个更好的方向,因为您当前的方法没有正确处理结果数据。不要使用mysql扩展。相反,请使用MySQLi或PDO_MySQL扩展名。使用其中一个替代扩展将有助于防止SQL注入。
使用PDO:
<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT doc FROM docs WHERE id = ?');
$sth->execute(array($_GET['id']));
$results = $sth->fetchAll();
?>
答案 3 :(得分:0)
像这样编辑:
<?php
$id = $_GET['id'];
$query = "SELECT doc
FROM docs
WHERE id = '".$id."';";
$doctext = mysqli_query($query);
?>
答案 4 :(得分:-2)
你走了:
<?php
$id = $_GET['id'];
$query = "SELECT doc
FROM docs
WHERE id = '" . mysql_real_escape_string($id) . "';";
$result= mysql_query($query);
$row = mysql_fetch_row($result);
echo $row['doc'];
?>
但正如建议的那样,尝试将此端口移植到mysqli_*
系列函数,因为mysql_*
函数现已弃用。