查询输出php代码

时间:2014-09-08 15:02:31

标签: php mysql sql

我正在关注一本关于PhP和MySQL的书,但以下代码无法正常运行:

<html>
    <head>
    <title>Book-O-Rama Search Results</title>
    </head>
<body>
<h1>Book-O-Rama Search Results</h1>
<?php
//short variables
$searchtype = $_POST['searchtype'];
$searchterm = trim($_POST['searchterm']);

echo $searchterm;

if(!$searchtype || !$searchterm) {
    echo 'You have not entered search details.';
    exit;
}

if(!get_magic_quotes_gpc()) {
    $searchtype = addslashes($searchtype);
    $searchterm = addslashes($searchterm);
}

@ $db = new mysqli('localhost', 'root', '', 'books');

if(mysqli_connect_errno()) {
    echo 'Error: could not connect to the database. Please try again later.';
    exit;
} else {
    echo "All right";
}

$query = "select * from books where ".$searchtype." like '%".$searchterm."%";
$result = $db->query($query);

$num_results = $result->num_rows;

echo "<p>Number of books found: ".$num_results."</p>";

for($i=0; $i < $num_results; $i++) {
    $row = $result->fetch_assoc();
    echo "<p><strong>".($i+1).". Title: ";
    echo htmlspecialchars(stripslashes($row['title']));
    echo"</strong><br />Author: ";
    echo stripslashes($row['author']);
    echo "<br /> ISBN: ";
    echo stripslashes($row['isbn']);
    echo "<br />Price: ";
    echo stripslashes($row['price']);
    echo "</p>";
}

$result->free();
$db->close();


?>
</body></html>

输出:

Book-O-Rama Search Results

query($query); $num_results = $result->num_rows; echo "
Number of books found: ".$num_results."

"; for($i=0; $i < $num_results; $i++) { $row = $result->fetch_assoc(); echo "
".($i+1).". Title: "; echo htmlspecialchars(stripslashes($row['title'])); echo"
Author: "; echo stripslashes($row['author']); echo "
ISBN: "; echo stripslashes($row['isbn']); echo "
Price: "; echo stripslashes($row['price']); echo "

"; } $result->free(); $db->close(); ?>

我无法理解为什么以及开始时的echo $searchterm;根本没有被执行。 附:我正在使用Xampp localhost运行脚本。

1 个答案:

答案 0 :(得分:0)

您的问题在于您的SQL查询。我可以补充说,这让我几乎流泪了。

" like '%".$searchterm."%"

您在第一个%处打开一个单引号,而不会在尾随%后关闭它。这会将您的其余代码转换为字符串。

除此之外,我真的建议你阅读This post on sanitizing input。您的代码非常容易受到攻击,尤其是将已清理的变量直接放入查询中。对于SQL查询中使用的任何变量,您应该使用PDO bound variables。对于输出,您应该通过htmlspecialchars()(可能还有strip_tags)运行它们。

我建议你选一本关于PHP / MYSQL的最新书。你的代码让我想起了Sams在2003年我买的时候自学了PHP - 没有考虑安全性和纯粹的功能性。