所以,我想创建自己的搜索引擎,通过在搜索框中输入标题来查找数据,并从我的数据库和输出中获取数据,就像用户输入搜索框一样..所以这是我的码: 1. HTML代码(搜索框)
<form id="hform-search" class="hform-search" method="post" action="">
<input id="search-box" class="form-control" type="text" placeholder=" I want to learn.." name="keyword" autocomplete="off" autofocus="" />
<div id="suggesstion-box"></div>
<input type="submit" class="btn btn-default f-tutorials" name="go_t" value="Find Tutorials" />
<input type="submit" class="btn btn-default f-course" name="go_c" value="Find Courses" />
<p class="hero-subtitle"><em>"Let us help you to involve"</em> </p>
</div>
</form>
PHP代码
$conn = mysqli_connect("localhost","root","","neurorial");
if ($_POST[go_t] == 'Find Tutorials') {
$keyword_t = $_POST[keyword];
$find_t = mysqli_query($conn, "SELECT * FROM search WHERE video_tutorial LIKE '%$keyword_t%' ");
$check_t = mysqli_num_rows($find_t);
if ($check_t == 0) {
echo 'sorry the video with this " $keyword_t " keyword is not found';
}else {
while ($rows_t=mysqli_fetch_array($find_t) ) {
echo "$rows_t[video_tutorial]<br>";
}
}
}
if ($_POST['go_c'] == 'Find Courses') {
global $conn;
$keyword_c = $_POST['keyword'];
$find_c = mysqli_query($conn, "SELECT * FROM search WHERE course LIKE '%$keyword_c%'");
$check_c = mysqli_num_rows($find_c);
if ($check_c == 0) {
echo "maaf pencarian Course dengan keyword $keyword_c tidak di temukan";
}else {
while ($find_c = mysqli_fetch_array($find_c) ) {
echo "$find_c[course]<br>";
}
}
}
然后我总是得到这个结果:
注意:使用未定义的常量go_t - 在第87行的D:\ KAMPUS \ Server \ htdocs \ PW \ Neuro.inc \ index.php中假定为'go_t'
注意:未定义的索引:第87行的D:\ KAMPUS \ Server \ htdocs \ PW \ Neuro.inc \ index.php中的go_t
注意:未定义的索引:第100行的D:\ KAMPUS \ Server \ htdocs \ PW \ Neuro.inc \ index.php中的go_c
任何人都可以解决这个问题并告诉我为什么我总是遇到这个错误? 提前致谢! :)
答案 0 :(得分:0)
这是因为您的代码也在提交表单之前执行
<?php
if ($_POST){ //<------------ Add this condition
$conn = mysqli_connect("localhost","root","","neurorial");
if ($_POST['go_t'] == 'Find Tutorials') { //<---------------- change here
$keyword_t = $_POST[keyword];
$find_t = mysqli_query($conn, "SELECT * FROM search WHERE video_tutorial LIKE '%$keyword_t%' ");
$check_t = mysqli_num_rows($find_t);
if ($check_t == 0) {
echo 'sorry the video with this " $keyword_t " keyword is not found';
}else {
while ($rows_t=mysqli_fetch_array($find_t) ) {
echo "$rows_t[video_tutorial]<br>";
}
}
}
if ($_POST['go_c'] == 'Find Courses') {
global $conn;
$keyword_c = $_POST['keyword'];
$find_c = mysqli_query($conn, "SELECT * FROM search WHERE course LIKE '%$keyword_c%'");
$check_c = mysqli_num_rows($find_c);
if ($check_c == 0) {
echo "maaf pencarian Course dengan keyword $keyword_c tidak di temukan";
}else {
while ($find_c = mysqli_fetch_array($find_c) ) {
echo "$find_c[course]<br>";
}
}
}
}
?>
答案 1 :(得分:0)
您收到了您提到的具体错误,因为您没有在PHP代码的第二行引用go_t
。
$_POST[go_t]
需要$_POST['go_t']
。
您还应该检查以确保在数组中也设置了密钥 - 这使得if
语句如下所示:
if (isset($_POST['go_t']) && $_POST['go_t'] == 'Find Tutorials') {
if (isset($_POST['go_c']) && $_POST['go_c'] == 'Find Courses') {
正如@ b-desai所说,你也可以添加if ($_POST)
条件;但这只是意味着代码不会运行,除非请求是通过POST进入的。
尽管如此,你的代码有一些非常重要的缺陷,以后会再次咬你。最重要的是,它受SQL注入,跨站点脚本(XSS)和CSRF的约束。最后,我在这里没有提到,但你应该自己研究一下。
要解决SQL注入 - 不要在SQL查询中使用插值字符串,就像在这些行中一样:
$find_t = mysqli_query($conn, "SELECT * FROM search WHERE video_tutorial LIKE '%$keyword_t%' ");
$find_c = mysqli_query($conn, "SELECT * FROM search WHERE course LIKE '%$keyword_c%'");
无论用户在搜索过滤器中输入什么内容,这些内容的写入方式都将直接传递到您的数据库中;你需要逃避,或者更好的是,使用准备好的陈述(谷歌将成为你的朋友;查看PDO)。
解决跨站点脚本问题;如果找不到搜索结果,您可以直接将用户的关键字输出到浏览器而不会转义它。如果他们添加了<script>
代码或类似代码,则可能会从您的用户那里窃取Cookie,或者更糟糕。
您应该始终确保逃避所有输出,并始终假设您的用户是恶意的 - 其中一些将是。
我意识到这只是一个小例子,但我要小心不要将这类代码投入生产。