PDA

View Full Version : بررسی فیلد خالی PHP



flat_00
جمعه 20 مهر 1397, 11:44 صبح
سلام من از برنامه نویسی هیچی نمیدونم. یه کد از اینترنت پیدا کردم که باهاش میشه در دیتابیس mysql با استفاده از php جستجو کرد. با اینکه همه چیز درست کار میکنه ولی یه مشکلی وجود داره و اون اینه که اگه فیلد خالی باشه و کسی دکمه go رو بزنه در صفحه بعد همه محتویات دیتابیس نشون داده میشه. کاری که من میخوام بکنم اینه که با یه خط به کدهای php اضافه کنم که اگه کسی فیلد جستجو رو خالی گذاشت و دکمه go یا search رو زد یا اینکه مستقیم به آدرس صفحه search.php رفت، در صفحه پیامی نشان داده بشه و بگه چیزی یافت نشد یا محتوایی برای نمایش وجود ندارد.

کد های من از دو قسمت تشکیل شده که در فایل های index.php و search.php هستند.

محتوای فایل index.php


<!DOCTYPE html><html>
<head>
<title>Search</title>
</head>
<body>
<form action="./search.php" method="get">
<input type="text" name="q">
<input type="submit" value="go">
</form>
</body>
</html>





محتوای فایل search.php

<?php
$conn = mysqli_connect("localhost", "user", "pass", "db_name");

if(mysqli_connect_errno()){
echo "Failed to connect: " . mysqli_connect_error();
}


error_reporting(0);


$output = '';



if(isset($_GET['q']) && $_GET['q'] !== ' '){
$searchq = $_GET['q'];

$q = mysqli_query($conn, "SELECT * FROM search WHERE keywords LIKE '%$searchq%' OR title LIKE '%$searchq%'") or die(mysqli_error());
$c = mysqli_num_rows($q);
if($c == 0){
$output = 'No search results for <b>"' . $searchq . '"</b>';
} else {
while($row = mysqli_fetch_array($q)){
$id = $row['id'];
$title = $row['title'];
$desc = $row['description'];
$link = $row['link'];

$output .= '<a href="' . $link . '">
<h3>' . $title . '</h3>
<p>' . $desc . '</p>
</a>';
}
}
} else {
header("location: ./");
}
print("$output");
mysqli_close($conn);

?>

مهرداد سیف زاده
یک شنبه 22 مهر 1397, 08:57 صبح
توی فایل index.php میتونید از امکانات html5 استفاده کنید و کاربر ملزم بشه که فیلد رو باید پر کنه پارامتر reuired بصورت زیر

<input type="text" name="q" required>

در گرفتن داده از کاربر شرط رو بصورت زیر تغییر بدید که ابتدا چک کنه اگر نامعتبر بود کلا برگرده و ادامه نده
البته بهینه تر هست که ابتدا ورودی کاربر رو چک کنه اگر نامعتبر بود اصلا به دیتابیس وصل نشه


<?php


$searchq = isset($_GET['q']) && !empty($_GET['q']) ? $_GET['q'] : null;
if ($searchq == null) {
header("location: ./");
return;
}


$conn = mysqli_connect("localhost", "user", "pass", "db_name");


if (mysqli_connect_errno()) {
echo "Failed to connect: " . mysqli_connect_error();
header("location: ./");
return;
}


error_reporting(0);


$output = '';


$q = mysqli_query($conn, "SELECT * FROM search WHERE keywords LIKE '%$searchq%' OR title LIKE '%$searchq%'") or die(mysqli_error());
$c = mysqli_num_rows($q);
if ($c == 0) {
$output = 'No search results for <b>"' . $searchq . '"</b>';
} else {
while ($row = mysqli_fetch_array($q)) {
$id = $row['id'];
$title = $row['title'];
$desc = $row['description'];
$link = $row['link'];


$output .= '<a href="' . $link . '">
<h3>' . $title . '</h3>
<p>' . $desc . '</p>
</a>';
}
}


print("$output");
mysqli_close($conn);


?>

flat_00
دوشنبه 23 مهر 1397, 23:48 عصر
توی فایل index.php میتونید از امکانات html5 استفاده کنید و کاربر ملزم بشه که فیلد رو باید پر کنه پارامتر reuired بصورت زیر

<input type="text" name="q" required>

در گرفتن داده از کاربر شرط رو بصورت زیر تغییر بدید که ابتدا چک کنه اگر نامعتبر بود کلا برگرده و ادامه نده
البته بهینه تر هست که ابتدا ورودی کاربر رو چک کنه اگر نامعتبر بود اصلا به دیتابیس وصل نشه


<?php


$searchq = isset($_GET['q']) && !empty($_GET['q']) ? $_GET['q'] : null;
if ($searchq == null) {
header("location: ./");
return;
}


$conn = mysqli_connect("localhost", "user", "pass", "db_name");


if (mysqli_connect_errno()) {
echo "Failed to connect: " . mysqli_connect_error();
header("location: ./");
return;
}


error_reporting(0);


$output = '';


$q = mysqli_query($conn, "SELECT * FROM search WHERE keywords LIKE '%$searchq%' OR title LIKE '%$searchq%'") or die(mysqli_error());
$c = mysqli_num_rows($q);
if ($c == 0) {
$output = 'No search results for <b>"' . $searchq . '"</b>';
} else {
while ($row = mysqli_fetch_array($q)) {
$id = $row['id'];
$title = $row['title'];
$desc = $row['description'];
$link = $row['link'];


$output .= '<a href="' . $link . '">
<h3>' . $title . '</h3>
<p>' . $desc . '</p>
</a>';
}
}


print("$output");
mysqli_close($conn);


?>


ممنون از شما کد زیر که نوشتید به خوبی جواب داد.


$searchq = isset($_GET['q']) && !empty($_GET['q']) ? $_GET['q'] : null;if ($searchq == null) { header("location: ./"); return;}

حالا یه چیزی به ذهنم رسید. اگه بخوام کاری کنم که کسی نتونه از کاراکترهای خاص یا عدد یا نقطه به تنهایی در قسمت search استفاده کنه باید چه تغییری در کد بالا بدم که علاوه بر اینکه کار کد بالا رو انجام میده این کار جدید رو هم انجام بده؟ چون نمیخوام کسی با وارد کردن علامت سوال یا نقطه یا عدد به هرچی اطلاعات در دیتابیس هست دسترسی پیدا کنه. الان اگه یک نفر یک نقطه رو به تنهایی در کادر جستجو تایپ کنه و دکمه رو بزنه تمام چیزهایی که در دیتابیس با نقطه هست براش نشون داده میشه.
ممنون میشم اگه در این مورد هم کمک کنید.

مهرداد سیف زاده
سه شنبه 24 مهر 1397, 08:50 صبح
میتونید فیلتر کنید. مقایسه رشته در php ساده هست یا براش regular expression تعریف کنید.
مثلا


$filter = array('.','?','+','=','-');
if ($searchq == null || in_array($searchq,$filter)) {
header("location: ./");
return;
}