我有一个用PHP / MySQL编写的搜索功能,工作正常。我想要发生的是,当用户产生搜索时,他们可以单击一个按钮,该按钮将输出中的$ id提交到我的数据库中的表。
我已经复制了下面的代码,错误在表单中的php echo中,它只显示php代码的纯文本。
其他一切正常,我已经通过将值设置为“”来测试这个并自己输入id然后就可以了。我希望它能成为未来的隐藏输入,其中id会自动从搜索结果中获得。可以在同一页面上返回多个搜索,此表单位于每个搜索结果的下方。
<?php
$conn = mysqli_connect("localhost","root","","users");
$output = '';
if(isset($_POST['search'])) {
$search = $_POST['search'];
$search = preg_replace("#[^0-9a-z]i#","", $search);
$query = mysqli_query($conn, "SELECT * FROM users WHERE main LIKE '%".$search."%'") or die ("Could not search");
$count = mysqli_num_rows($query);
if($count == 0){
$output = "There was no search results!";
}else{
while ($row = mysqli_fetch_array($query)) {
$id = $row ['id'];
$main = $row ['main'];
$postcode = $row ['postcode'];
$available = $row ['available'];
$email = $row ['email'];
$output .='<div><br><b>Player ID: </b>'.$id.'<br><b>Main:
</b>'.$main.'<br><b>Postcode: </b>'.$postcode.'<br><b>Available:
</b>'.$available.'<br>
<br>
<form action="request_player.php" action="post">
<input type="text" name="id" value="<?php echo $id ?>">
<input type="submit" value="Request Player">
</form>
</div>';
}
}
}
echo $output;
?>
<br> <a href="index.php">Back to your account</a>
答案 0 :(得分:1)
它发生的原因是因为你已将<?php echo $id ?>
放在字符串中。您希望执行与示例中其他位置相同的操作:value="' . $id . '"
当单引号和双引号一起发生时,它很快就会变得混乱。您可能最好学习如何使用PHPs multiline strings。
另外,<?= $id ?>
是<?php echo $id ?>
的有用简写(尽管您不想在这里使用)
答案 1 :(得分:1)
杰伊·布兰查德突出强调的问题以及你有点轻视的问题 - 也许是因为你害怕当前问题的分心 - 实际上与你在问题中强调的问题非常相关。
这顺便说一下。没什么不常见的。在这个小脚本中,您可以使用三种语言处理:HTML,SQL和PHP。所有这些都混杂在一起。事情混乱可能会发生。
有一些方法可以防止这些小错误。 Jay强调的是如何正确编码SQL查询。
另一个问题是正确编码HTML字符串。让我强调一下这个部分:
$output = '... <input type="text" name="id" value="<?php echo $id ?>"> ...';
在这个PHP字符串中,你写了#34; <?php echo $id ?>
&#34;逐字逐句,这意味着,这将在当时回响。
你最有可能的意思是这样写:
$output = '... <input type="text" name="id" value="' . $id . '"> ...';
所以这似乎很容易解决。但是,无论是SQL还是HTML,如果要将它们用作SQL或HTML,都需要对值进行正确编码,这一点非常重要。在HTML情况下,您必须确保将ID正确编码为HTML属性值。在PHP中有一个方便的功能:
$output = '... <input type="text" name="id" value="' . htmlspecialchars($id) . '"> ...';
或者ID是数字:
$output = '... <input type="text" name="id" value="' . intval($id) . '"> ...';
同样运作良好。
您需要处理所有用户数据,即所有输入 - 包括您从数据库中获取的内容(!) - 当您将其传递给其他语言时需要对其进行处理,无论是HTML,SQL还是Javascript
对于SQL,Jay已经为您提供了一个很好的资源,对于HTML我没有一个好的资源,但它需要您自己的体贴和意志,以了解您在那里做什么(写)。这样可以提高你的感官,并为每个操作想象那里发生的事情以及这一切是如何组合在一起的。
将事物分开并因此有助于专注于工作的一种方法是首先收集您想要输出的所有数据,然后在输出的模板中处理这些变量。这会阻止您创建大字符串,以便稍后回显它们。 PHP自动回应,PHP的好处是你可以轻松地使用它进行模板化。
另一种方法是首先处理表单输入 - 再次处理到您自己的变量结构 - 这是程序输入部分并首先运行。然后跟着输入数据的处理,在你运行和处理数据库查询的情况下。之后你关心演讲。通过这种方式,您可以使用更加流畅的常用步骤。
我希望这是可以理解的。它充满了进一步的障碍,但划分并克服这些编程问题是值得的。它还可以帮助你写更多,同时你需要少写。
顺便说一下,你不需要切换到PDO,你可以坚持使用Mysqli。