استفاده از WHERE در پرس و جوی MySQL

در حالت اولیه و بدون وجود پارامترهای محدود کننده معمولا دستور SELECT تمام ردیف ها را به عنوان نتیجه پرس و جو از جدول برمی گرداند که ممکن است مورد انتظارمان نباشد و مدت زمان زیادی نیز صرف اجرای فرآیند پرس و جو خواهد شد که در دنیای برنامه نویسی حالت بهینه نیست، به عنوان مثال اگر لیست اسامی ده هزار نفر را در دیتابیس خود به صورت نام، نام خانوادگی و سن داشته باشیم و بخواهیم به فرض تنها افرادی که اسم آنها بهرام است در خروجی انتخاب شوند باید از دستور دیگری تحت عنوان WHERE و پارامترهای آن جهت تکمیل دستور SELECT استفاده کنیم، دستور WHERE در واقع نشانی دقیق ستون و ردیف هایی که ما از MySQL پرس و جو می کنیم را مشخص می کند و از این جهت در کدنویسی PHP در ارتباط با پایگاه داده MySQL اهمیت و کاربرد زیادی دارد.
استفاده از WHERE در دستور SELECT
برای اینکه صرفا ردیف یا ردیف های خاصی به عنوان نتیجه جستجو انتخاب شوند باید از پارامترهای اضافه در پرس جوی SELECT استفاده کنیم، یکی از پرکاربردترین این پارامترها دستور WHERE است که قیدهای زیرمجموعه متفاوتی دارد، به طور مثال امکان استفاده از عملگر مقایسه شامل < = > یا استفاده از عبارت LIKE که در ادامه توضیح خواهیم داد.
در مثال های زیر با استفاده از دستور WHERE و افزودن قیدهایی به آن اطلاعات دقیق تری از پایگاه داده انتخاب می کنیم.
انتخاب ردیف ها از جدول با عملگر = (مساوی):
زمانی که بخواهیم انتخاب نتایج مبتنی بر جود عین یک مقدار رشته ای یا عددی در ستون های دیتابیس باشد می توانیم از عملگر = استفاده کنیم:
WHERE col = 'value'
مثال:SELECT * FROM table WHERE col = 'word'
انتخاب ردیف ها از جدول با عملگر < > (بزرگتر، کوچکتر):در خصوص ستون هایی که از نوع عددی هستند اگر بخواهیم بر اساس مقایسه بزرگتر کوچکتر ردیف ها را انتخاب کنیم عملگرهای < > کاربرد دارند:
WHERE col > value
مثال:SELECT * FROM table WHERE col > 50
این نمونه پرس و جو تمام ردیف ها را از جدول فرضی table در جایی که مقدار ستون فرضی col بزرگتر از 50 باشد انتخاب می کند.انتخاب ردیف ها از جدول با دستور LIKE (شباهت):
اگر تنها برابری بخشی از مقدار موجود در دیتابیس با عبارت مد نظرمان مطلوب باشد گزینه پیش فرض معمولا استفاده از دستور LIKE است:
WHERE col LIKE 'value%'
مثال:SELECT * FROM table WHERE col LIKE 'word%'
این نمونه پرس و جو تمام ردیف ها را از جدول فرضی table در جایی که مقدار ستون فرضی col با عبارت word شروع شده باشد انتخاب می کند.برای یادآوری مباحث گذشته نحوه استفاده از WHERE را با پرس و جوی کامل مرور می کنیم.
برنامه نویسی رویه ای (Procedural):
<?php
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn){
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else{
//سازگاری با حروف فارسی
$sql = "SET NAMES 'utf8'";
$query = mysqli_query($conn, $sql);
//اانتخاب اطلاعات از جدول و ستون ها
$sql = "SELECT * FROM table WHERE col = 'word'";
$query = mysqli_query($conn, $sql);
if(!$query){
echo "Selecting From Table: Error! " . mysqli_error($conn) . '<br>';
} else{
//تعداد ردیف های انتخاب شده
$count = mysqli_num_rows($query);
//پردازش و خروجی ردیف های اطلاعات
if($count > 0){
while($row = mysqli_fetch_array($query)){
echo $row['col'] . '<br>';
}
} else{
echo "No Rows Found in Table!";
}
}
}
//پایان اتصال
mysqli_close($conn);
?>
برنامه نویسی شی گرا (Object-oriented):<?php
//اتصال به دیتابیس
$conn = new mysqli("localhost", "username", "password", "dbname");
if(!$conn) {
echo "PHP & MySQL Connection: Error! " . $conn->errno . ' - ' . $conn->error;
exit;
} else {
//سازگاری با حروف فارسی
$sql = "SET NAMES 'utf8'";
$conn->query($sql);
//اانتخاب اطلاعات از جدول و ستون ها
$sql = "SELECT * FROM table WHERE col = 'word'";
$query = $conn->query($sql);
if(!$query){
echo "Selecting Table: Error! " . $query->error() . '<br>';
} else{
//تعداد ردیف های انتخاب شده
$count = $query->num_rows;
//پردازش و خروجی ردیف های اطلاعات
if($count > 0){
while($row = $query->fetch_array()){
echo $row['col'] . '<br>';
}
} else{
echo "No Rows Found in Table!";
}
}
}
//پایان اتصال
$conn->close();
?>
این نمونه پرس و جو تمام ردیف ها را از جدول فرضی table در جایی که مقدار ستون فرضی col برابر با عبارت word باشد انتخاب می کند.نکته: استفاده از کاراکتر * در پرس و جو توصیه نمی شود مگر اینکه واقعا بخواهیم اطلاعات را از تمام ستون ها انتخاب کنیم، برای بهینه بودن پرس و جو بهتر است به جای کاراکتر * نام ستون های مد نظر را درج کنیم به فرض:
SELECT id, name, status FROM table WHERE name = 'word'
در ادامه آموزش هر کدام از وضعیت های بالا را بررسی می کنیم.استفاده از عملگرهای < = > در دستور WHERE
همان طور که اشاره شد عبارت WHERE در دستور SELECT تعیین کننده منظور دقیق ما در انتخاب ردیف های اطلاعات درخواستی از پایگاه داده است، مثل اینکه در کتابخانه از میان قفسه های موجود، بخش تاریخ، دسته تاریخ جهان، صرفا کتب انتشارات مد نظرمان را انتخاب کنیم، مشابه دنیای واقعی در نوشتن پرس و جوهای MySQL نیز تمام جزئیات درخواست باید با عباراتی بیان شود که این کار با پارامترهای دستور WHERE صورت می گیرد، یکی از این پارامترها عملگرهای بزرگتر، کوچکتر و مساوی (< = >) هستند، با کمک این عملگرها می توانیم از دیتابیس سایت ردیف هایی را انتخاب کنیم که به فرض سن کاربر از 25 سال بیشتر باشد، در نمونه پرس و جوی زیر از جدول فرضی users با مقایسه ستون age نام کاربرانی که سن آنها از 25 سال بیشتر است را انتخاب می کنیم:
SELECT name FROM users WHERE age > 25
در واقع عبارت بالا به این معنی است: از جدول فرضی users ستون name، تنها ردیف هایی را انتخاب کن که مقادیر سن در ستون age بزرگتر از 25 باشد.مشابه همین کار در مثال زیر این بار با علامت نا مساوی (=!) انجام شده است:
SELECT name FROM users WHERE age != 25
عبارت بالا به این معنی است: از جدول فرضی users ستون name، تنها ردیف هایی را انتخاب کن که مقادیر سن در ستون age برابر با 25 نباشد.نکته: به خاطر داشته باشیم عملگرهای بزرگتر و کوچکتر تنها در مقایسه ستون های از نوع عدد کاربرد دارند و بهتر است نوع داده ها به صورت INT (عددی) باشد، اما از علامت مساوی و نامساوی هم برای ستون های با مقدار عددی و هم برای ستون های با مقادیر رشته ای (متنی) می توانیم استفاده کنیم.
استفاده از LIKE در دستور WHERE
استفاده از عملگرهای بزرگتر، کوچکتر و مساوی در دستور WHERE به تنهایی تمام خواسته های ما را در ارتباط با اجرای پرس و جوی SELECT از پایگاه داده پوشش نمی دهد، فرض کنیم اسامی کاربران سایت جهت نمونه به صورت زیر در جدول دیتابیس ذخیره شده است:
Arash
Behdad
Behzad
Arman
Sasan
Sajad
Armin
اگر بخواهیم کاربرانی را که دو حرف اول نام آنها با حروف A و R شروع شده است را انتخاب کنیم با عملگرهایی که پیشتر گفتیم این کار ممکن نیست، این عملگرها عدد یا مقدار رشته ای را به صورت بسته و یکجا مقایسه می کنند به طور مثال با عملگر مساوی تنها می توانیم بنویسیم:SELECT id, name FROM table WHERE name = 'Arman'
این دستور فقط ردیف یا ردیف هایی را که مقادیر ستون name در آنها Arman باشد انتخاب می کند اما با استفاده از پارامتر LIKE در دستور WHERE مشکل رفع می شود، پارامتر LIKE معمولا به همراه کاراکتر % (Percent Wildcard) استفاده می شود که به معنی نادیده گرفتن ادامه یا ابتدای مقادیر مد نظر در جستجو است، در مثال زیر با کاربرد LIKE بیشتر آشنا می شویم:SELECT id, name FROM table WHERE name LIKE 'Ar%'
زمانی که پس از دو حرف Ar علامت % را قرار می دهیم در واقع به MySQL می گوییم که فقط دو حرف اول برایمان اهمیت دارد و بقیه عبارت هر چیزی می تواند باشد، دستور بالا ردیف های مربوط به اسامی زیر را به عنوان نتیجه پرس و جو انتخاب می کند:Arash
Arman
Armin
حال تصور کنیم کاربری با نام فرضی PHPArmin نیز در لیست کاربران سایت ثبت شده است، دستور بالا این کاربر را انتخاب نمی کند چرا که عبارت PHPArmin با حروف Ar شروع نشده است اما تغییر پرس و جو به صورت نمونه زیر شامل این نوع اسامی نیز خواهد شد:SELECT id, name FROM table WHERE name LIKE '%Ar%'
در واقع با افزودن یک % در ابتدا و انتهای عبارت پرس و جو، مفسر MySQL چنین برداشت می کند که تنها برایمان وجود عبارت Ar در بین نام کاربری مهم است و ابتدا یا انتهای رشته نادیده گرفته می شود، به این صورت می توان گفت:علامت % (Percent Wildcard) اگر در ابتدا قرار گیرد حروف ماقبل و اگر در انتها قرار گیرد حروف مابعد عبارت مورد پرس و جو نادیده گرفته می شود.
ذکر این نکته ضروری است که در کار با دستور LIKE و علامت % باید به بحث سرعت اجرای پرس و جوها و انتخاب حداقل ردیف ها دقت کنیم و دامنه انتخاب مقادیر را بیش از حد مورد انتظار توسعه ندهیم، برای اعداد نیز بهتر است از عملگرهای < = > به جای LIKE استفاده کنیم، در مباحث آینده در خصوص پارامتر LIMIT و اینکه چگونه تعداد ردیف های انتخاب شده را کاهش و در نتیجه سرعت اجرای پرس و جوها را افزایش دهیم بیشتر خواهیم گفت.
نکته: بعضا مشاهده می شود از LIKE به عنوان پایه کار در برنامه نویسی سیستم های جستجو استفاده می شود، یادآور می شویم اگرچه جستجو با LIKE برای دیتابیس های کم حجم نتایج مطلوبی در پی دارد اما برای پایگاه داده بزرگ، موتورهای جستجو معمولا جهت افزایش دقت و سرعت کار از سیستم ایندکس گذاری استفاده می کنند که الگوریتم های پیشرفته و مباحث جداگانه ای دارد.
دسته بندی: آموزش مقدماتی » MySQL
برچسب ها: MySQL

حذف مقادیر از MySQL با دستور DELETE
نحوه ذخیره کردن اطلاعات با دستور INSERT در MySQL
توابع تجمیعی (Aggregate Functions) در MySQL
اتصال PHP به MySQL با اکستنشن MySQLi
استفاده از JOIN و ساخت پرس و جوی ترکیبی در MySQL
دیدگاه


m.b
۲۰:۴۶ ۱۴۰۰/۱۱/۱۷
با سلام و تشکر فراوان بابت آموزش های عالیتون و اینکه زمان میزارین و سوالات را پاسخ میدین چند تا سوال داشتم خدمتتون و اون اینکه من یک دیتابیس دارم جدول به نام patients که دارای فیلدهای مختلفی از جمله تاریخ ویزیت بیماران و ساعت ویزیت می باشد می خواستم با توجه به نمونه کدهای پایین چند تا سوال از خدمتتان بپرسم.
اول اینکه اگه بخوام با توجه به تاریخ روز لیست آخرین بیماران را بدونم به چه صورت باید عمل کنم. مثلا امروز دوشنبه 18 بهمن 1400 خود بخود بیاد از لیست بروز بشه و لیست بیماران روز رو نشون بده.
دوم اینکه حالا لیست بیماران با توجه به تاریخ روز را دارم به چه صورت از نزولی به صعودی با توجه به سورس هام انجام دهم.
و همچنین در قسمت تعداد بیماران امروز تعداد بیماران را بروز فقط به عدد مثلا امروز 14 عدد می باشد رو نشون بده. و خود بخود بروز بشه.
اول اینکه اگه بخوام با توجه به تاریخ روز لیست آخرین بیماران را بدونم به چه صورت باید عمل کنم. مثلا امروز دوشنبه 18 بهمن 1400 خود بخود بیاد از لیست بروز بشه و لیست بیماران روز رو نشون بده.
دوم اینکه حالا لیست بیماران با توجه به تاریخ روز را دارم به چه صورت از نزولی به صعودی با توجه به سورس هام انجام دهم.
و همچنین در قسمت تعداد بیماران امروز تعداد بیماران را بروز فقط به عدد مثلا امروز 14 عدد می باشد رو نشون بده. و خود بخود بروز بشه.
<div class="col-10 col-s-12" style="margin-top:5px; font-family: 'MyFont';background:blue;height:auto;display:block;border:2px solid #9fcdff;border-radius:5px">
<p style="margin-top;0px;float:right;color:white">مدیریت بیماران</p>
<p style="margin-top;0px;float:left;color:white;margin-bottom:0PX">دکتر </p>
<p style="margin-top;0px;float:right;margin-top:50px;margin-right:0px;color:white">امروز <img style="height:30px;width:30px;margin-top:0px;margin-left:5px;margin-bottom:0px;float:right" src="../img/calendar_date.png">
<?php
include("../jdf.php");
print jdate(" l jFY");
#تاریخ روز
?>
</p>
<p style="margin-top;0px;float:right;margin-top:50px;margin-right:100px;color:white">
<img style="height:30px;width:30px;margin-top:0px;margin-left:5px;margin-bottom:0px;float:right" src="../img/users.png">
تعداد کل بیماران:
<?php
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("ارتباط برقرار نشد: " . $conn->connect_error);
}
$sql = "SELECT * FROM patients WHERE lastname!= '' ";
if($result = mysqli_query($conn, $sql)) {
$row_count = mysqli_num_rows($result);
echo $row_count." " ;
}
$conn->close();
?>
<p style="margin-top;0px;float:right;margin-top:50px;margin-right:100px;color:white">
<img style="height:30px;width:30px;margin-top:0px;margin-left:5px;margin-bottom:0px;float:right" src="../img/users.png">
تعداد بیماران امروز:
<?php
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("ارتباط برقرار نشد: " . $conn->connect_error);
}
$sql = "SELECT * FROM patients WHERE lastname!= '' AND date='1400-11-16'";
if($result = mysqli_query($conn, $sql)) {
$row_count = mysqli_num_rows($result);
echo $row_count." " ;
}
$conn->close();
?>
</p>
<button style="width:200px;margin-top:0px;margin-bottom:2px;margin-right:10px;height:35px;color:blue;font-family: 'MyFont'" onclick="location='../dashbord/add-turn.php'">افزودن نوبت جدید</button>
<div class="aside"style="margin-bottom:0px;background:blue" >
<div class="Search" style="background:blue"><div class="title-right" style="background:blue"><p class="right" style="color:white;" >لطفا جهت مشاهده تاریخ مورد نظر را وارد نموده و جستجو نمایید<hr class="right" style=""></p>
<form action="search.php" style="width:100%;" method="post">
<input class="Search" style="width:75%;margin-right:2%;float:right; border-radius:10px;border:1px solid blue;height:30px"type="text" name="query"placeholder="عبارت مورد نظر را جستجو نمایید...">
<input class="w3-hover-shadow" style="margin-left: 2%;border-radius:5px;background:blue;color:white;width:20%;height:30px"type="submit" name="search" value="جستجو">
</form></div></div>
</div>
</div>
</div>
<div class="col-10 col-s-12" style="margin-top:5px;">
<?php
$con=mysqli_connect("localhost","","","");
// Check connection
if (mysqli_connect_errno()){
echo "به دلیل مشکل زیر، اتصال برقرار نشد : <br />" . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT * FROM patients WHERE date='1400-11-16' ORDER BY `time` ASC");
echo "<table border='1' >
<tr>
<th >ردیف</th>
<th>نام</th>
<th>نام خانوادگی</th>
<th>کد ملی </th>
<th>شماره تماس </th>
<th>تاریخ</th>
<th>روز</th>
<th>زمان</th>
<th>وضعیت پرداخت</th>
<th>توضیحات</th>
<th>ویرایش</th>
<th>حذف</th>
</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['firstname'] . "</td>";
echo "<td>" . $row['lastname'] . "</td>";
echo "<td>" . $row['nationalcode'] . "</td>";
echo "<td>" . $row['mobile'] . "</td>";
echo "<td>" . $row['date'] . "</td>";
echo "<td>" . $row['day'] . "</td>";
echo "<td>" . $row['time'] . "</td>";
echo "<td>" . $row['paymentstatus'] . "</td>";
echo "<td>" . $row['description'] . "</td>";
echo "<td>" .'<a href="https://www.drmoslemsoltani.ir/dashbord/update.php"><img src="/img/edite.png" width="20px" height="20px" alt="update"/></img></a>';
echo "<td>" .'<a href="https://www.drmoslemsoltani.ir/dashbord/delete.php"><img src="/img/delete.png" width="20px" height="20px" alt="delete"/></img></a>';
echo "</tr>";
}
echo "</table>";
?>
</div>
</div>
ممنونم از اینکه وقت میزارید.ظاهرا بخشی از کدها را نوشته اید البته چون دیتابیس و نمونه اطلاعات در دسترس نیست کدها هم قابل تست و آزمایش و خطا نیستند، در هر صورت پاسخ سوالتتان نیاز به مقدمات زیادی دارد و نمی دانیم که تا چه حد با PHP و MySQL آشنا هستید، با فرض آشنایی نسبی برای سوال اول یعنی استخراج لیست آخرین بیماران می توانید از پرس و جویی که خودتان هم نوشته اید استفاده کنید، به فرض:
برای تغییر چینش از نزولی به صعودی و برعکس اگر می خواهید اطلاعات مجدد از دیتابیس استخراج و به فرض با Ajax و JavaScript در جدول به روزرسانی شوند باید به جای ASC از DESC استفاده کنید اما اگر می خواهید صرفا یک بار اطلاعات استخراج شده و نزولی و صعودی شدن را در سمت کاربر انجام دهید می توانید آموزش زیر را بررسی کنید:
SELECT * FROM patients WHERE date='1400-11-16' ORDER BY `time` ASC
این پرس و جو لیست بیماران را بر اساس تاریخ روز نمایش می دهد که تاریخ روز را می توانید به صورت متغیر داشته باشید:SELECT * FROM patients WHERE date='$date' ORDER BY `time` ASC
البته برای پارامترها باید از یکی از روش های ایمن سازی در اکستنشن MySQLi استفاده کنیم.برای تغییر چینش از نزولی به صعودی و برعکس اگر می خواهید اطلاعات مجدد از دیتابیس استخراج و به فرض با Ajax و JavaScript در جدول به روزرسانی شوند باید به جای ASC از DESC استفاده کنید اما اگر می خواهید صرفا یک بار اطلاعات استخراج شده و نزولی و صعودی شدن را در سمت کاربر انجام دهید می توانید آموزش زیر را بررسی کنید:
http://jsfiddle.net/zscQy
برای سوال سوم و نمایش تعداد بیماران هم ظاهرا خودتان قسمتی از کدها را نوشته اید://Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
//Check connection
if ($conn->connect_error) {
die("ارتباط برقرار نشد: " . $conn->connect_error);
}
$sql = "SELECT * FROM patients WHERE lastname!= '' AND date='1400-11-16'";
if($result = mysqli_query($conn, $sql)) {
$row_count = mysqli_num_rows($result);
echo $row_count." " ;
}
$conn->close();
متاسفانه کدهای شما تکرارها و اشتباهاتی دارند، به فرض در چندین قسمت اتصال به دیتابیس انجام شده که می توان در یک مورد آنها را خلاصه کرد، همچنین دقت کنید که برای برقراری اتصال دیتابیس نیاز به نام کاربری و کلمه عبور پایگاه داده دارید که باید از قبل از طریق کنترل پنل هاست ایجاد کرده باشید.محسن
۱۶:۳۰ ۱۴۰۰/۰۵/۲۷
سلام
امکانش هست نمونه کد فراخوانی عکس و لینک ادرس رو از دیتابیس توضیح دهید . من بعد از متصل شدن به دیتابیس متن ها و عنوان ها رو میتونم فراخوانی کنم ولی تو فراخوانی عکس های تو دیتابیس و همچنین لینک های هر عنوان مشکل دارم ممنون میشم با یک نمونه کد توضیح دهید.
امکانش هست نمونه کد فراخوانی عکس و لینک ادرس رو از دیتابیس توضیح دهید . من بعد از متصل شدن به دیتابیس متن ها و عنوان ها رو میتونم فراخوانی کنم ولی تو فراخوانی عکس های تو دیتابیس و همچنین لینک های هر عنوان مشکل دارم ممنون میشم با یک نمونه کد توضیح دهید.
تصاویر به صورت دیتا در MySQL ذخیره شده اند یا صرفا نام تصویر ذخیره شده و فایل اصلی در یکی از دایرکتوری های هاستتان قرار دارد؟ نوع داده ستون تصویر به چه صورت است (BLOB, TEXT, VARCHAR و...)؟ لینک به چه صورتی در ردیف ها ذخیره شده؟ لطفا یک نمونه درج کنید.
ُسینا
۰۰:۵۹ ۱۳۹۷/۰۹/۰۷
سلام من یه دستوری دارم که به شکل زیر هست :
راهنمایی بفرمایید ممنون میشم
$result = mysqli_query($con, "SELECT * FROM Persons WHERE PersonnelCode = PersonnelCode");
echo "<div class='container'>
<div class='row'>
<div class='col-md-12'>
<table class='table table-bordered'>
<thead>
<tr>
<th scope='col'>Firstname</th>
<th scope='col'>Lastname</th>
<th scope='col'>PersonnelCode</th>
</tr>
</thead>";
while($row = mysqli_fetch_array($result)) {
echo "<tbody><tr>";
echo "<td>" . $row['FirstName'] . "</td>";
echo "<td>" . $row['LastName'] . "</td>";
echo "<td>" . $row['PersonnelCode'] . "</td>";
echo "</tr></tbody>";
}
echo "</table></div></div></div>";
mysqli_close($con);
که میخوام بر اساس PersonnelCode جستجو کنه اگه همچین کدی وجود داشت همه فیلدهای مربوط به اونو برگردونه ولی هرکاری میکنم خالی برمیگردونه راهنمایی بفرمایید ممنون میشم
مشکلی به لحاظ Syntax در این قسمت از کدها مشاهده نمی شود، پرس و جو را به صورت مستقیم در قسمت SQL برنامه phpMyAdmin اجرا کنید، اگر نتیجه در بر داشت ممکن است ایراد از اتصال به دیتابیس در کدهای PHP باشد، در این صورت با توابع مربوط به خطایابی مانند connect_errno در اکستنشن MySQLi می توانید مشکل را پیدا کنید، مثال:
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn) {
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else {
echo "PHP & MySQL Connection: Ok!<br>";
}
همچنین می توانید پرس و جو را نیز خطایابی کنید، مثال:$sql = "SELECT * FROM Persons WHERE PersonnelCode = PersonnelCode";
$query = mysqli_query($conn, $sql);
if(!$query) {
echo mysqli_error($conn);
} else {
echo "OK!";
}
masoud
۱۸:۴۹ ۱۳۹۷/۰۷/۳۰
با سلام. چطور میشه رکوردهای یک جدول را با دستورات حلقه پر کرد
مثلا یه loop قبل از insert into بزاریم که به تعداد دفعات لوپمون رکورد به جدول اضافه کنه.
مثلا یه loop قبل از insert into بزاریم که به تعداد دفعات لوپمون رکورد به جدول اضافه کنه.
با توجه به هدف و ساختار کدنویسی برنامه انجام این مورد می تواند متفاوت باشد، به طور مثال در ساده ترین شکل ممکن:
$array = array(
'PHP' => 'Web',
'Android' => 'Mobile'
);
foreach($array as $key => $value) {
$sql = "INSERT INTO tbl (title, description) VALUES ($key, $value)";
mysqli_query($conn, $sql);
}
$array = array(
0 => array('PHP', 'Web'),
1 => array('Android', 'Mobile')
);
for($i = 0; $i < count($array); $i++) {
$sql = "INSERT INTO tbl (title, description) VALUES ($array[$i][0], $array[$i][1])";
mysqli_query($conn, $sql);
}
احسان
۰۱:۰۷ ۱۳۹۶/۱۲/۲۰
با سلام
چطور میتونیم در یک دیتابیس مقدار رکورد دو جدول رو با هم مقایسه کنیم و اگه مساوی بودن مقدار یک رکورد در یکی از جداول رو افزایش بدیم
من یه دستور نوشتم ولی پیغام خطا میده ، لطفا تغییراتش رو بهم بگین
چطور میتونیم در یک دیتابیس مقدار رکورد دو جدول رو با هم مقایسه کنیم و اگه مساوی بودن مقدار یک رکورد در یکی از جداول رو افزایش بدیم
من یه دستور نوشتم ولی پیغام خطا میده ، لطفا تغییراتش رو بهم بگین
UPDATE table1 SET viw=viw+1 WHERE table1.num1=table2.num2
برای UPDATE مقادیر ستون یک جدول بر اساس مقایسه مقادیر ستون های دو جدول می توانید از پرس و جوی نمونه زیر استفاده کنید:
UPDATE tbl_1 AS a JOIN tbl_2 AS b ON a.col = b.col SET a.col = a.col + 1 WHERE a.col = b.col
عبارت tbl باید با نام جداول و عبارت col باید با نام ستون ها جایگزین شود.امیر
۲۰:۰۲ ۱۳۹۶/۰۷/۲۲
سلام . من تو دیتابیس یه جدول دارم که ستون title رو براش primary key کردم و قرار بر این هستش که یه رشته از کاربر گرفته بشه و درون یه متغیر ریخته بشه و با دستور select محتویات اون رکوردی که برابر با متغیر هستش نشون داده بشه . تو کوئری بعد از WHERE مینویسم
title=$t
که t همون متغیریه که رشته توشه. ولی عمل نمیکنه اصن. کجاش اشتباهه به نظر شما ؟قاعدتا این مورد باید با خطایابی مشخص شود که نیاز به اجرای مرحله به مرحله کدها دارد.
محمد
۲۲:۵۵ ۱۳۹۶/۰۴/۱۸
سلام
خدا قوت
چطوری تعداد سطرهای دیتابیس را حساب بنماییم
یعنی تعداد کاربران و بعد در صفحه نمایش دهیم
خدا قوت
چطوری تعداد سطرهای دیتابیس را حساب بنماییم
یعنی تعداد کاربران و بعد در صفحه نمایش دهیم
بسته به اکستنشن استفاده شده (MySQL, MySQLi یا PDO) روش ها کمی متفاوت است، به طور مثال در MySQLi از تابع mysqli_num_rows یا از دستور COUNT می توانید استفاده کنید، مثال:
$query = mysqli_query($link, "SELECT id FROM tbl_name);
$count = mysqli_num_rows($query);
$query = mysqli_query($link, "SELECT COUNT(id) FROM tbl_name");
$row = mysqli_fetch_row($query);
$count = $row[0];
با توجه به قدیمی و منسوخ شدن اکستنشن MySQL بهتر است از اکستنشن مشابه آن یعنی MySQLi استفاده کنید!۱۴:۰۱ ۱۳۹۵/۱۱/۱۸
مقدار ID به صورت Auto Increment هستش ولی تو دستور Where ID = 1 مقدار ID مد نظر بنده نمایش داده نمیشه.
ممنون
http://uupload.ir/files/pql5_capture.png
آی دی ها اتوماتیک افزایش می یابند! فقط یک راهنمایی بفرمایید تو دستور زیر : mysql_query("SELECT * FROM pays WHERE ID = ");
برای مقدار آی دی چه متغیر یا ... تعریف کنم که اطلاعات اون row رو بدست بیاره.ممنون
اینکه چه متغیری تعریف کنید بستگی به خودتان و پارامترهایی دارد که در برنامه از کاربر یا به طریق دیگر دریافت می شود، به طور مثال ID می تواند از طریق آدرس URL و متد GET به سرور ارسال شود، در این صورت کافیست یک متغیر را با آن مقدار دهی کنید:
localhost/index.php?id=22
$user_id = $_GET['id'];
همین متغیر را می توانید در پرس و جوی خود (البته با رعایت اصول ایمن سازی داده ها قبل از استفاده در پرس و جوی MySQL از جمله استفاده از تابع mysqli_real_escape_string) استفاده کنید: mysqli_query($conn, "SELECT * FROM pays WHERE ID = $user_id");
نکته: بهتر است به جای MySQL که اکستنشن قدیمی است از MySQLi استفاده کنید (در حالت عادی تفاوت زیادی بین این دو اکستنشن وجود ندارد در وب جستجو کنید، آموزش ها در خصوص MySQLi زیاد است!).۰۲:۴۳ ۱۳۹۵/۱۱/۱۸
سلام
یه فرم پرداخت آنلاین طراحی کردم که از 2 درگاه استفاده میکنه و درگاه توسط کاربر تعیین میشه.
فرم پرداخت توسط HTML طراحی شده و فرم اکشن با متد پست به یک فایل php هدایت میشه.
در فایل php مذکور، با متد POST اطلاعات فرم که توسط کاربر تکمیل شده فراخوانی میشود و سپس در یک دیتابیس ذخیره میشود. تا اینجای کار همه چیز بدون مشکل انجام میشود. اما قسمت دیگر کار، برای هدایت به صفحه پذیرنده بانک، اطلاعات ثبت شده در دیتابیس را فراخوانی میکنم.
اما در دستور زیر دچار مشکل هستم :
لطفا راهنمایی بفرمایید.
با تشکر
یه فرم پرداخت آنلاین طراحی کردم که از 2 درگاه استفاده میکنه و درگاه توسط کاربر تعیین میشه.
فرم پرداخت توسط HTML طراحی شده و فرم اکشن با متد پست به یک فایل php هدایت میشه.
در فایل php مذکور، با متد POST اطلاعات فرم که توسط کاربر تکمیل شده فراخوانی میشود و سپس در یک دیتابیس ذخیره میشود. تا اینجای کار همه چیز بدون مشکل انجام میشود. اما قسمت دیگر کار، برای هدایت به صفحه پذیرنده بانک، اطلاعات ثبت شده در دیتابیس را فراخوانی میکنم.
اما در دستور زیر دچار مشکل هستم :
mysqli_query($conn, "SELECT * FROM pays WHERE ID
در هنگام ثبت اطلاعات در ستون ID، از تابع rand استفاده کردم و به خوبی کار میکند، اما نمیتوانم ID که به صورت رندوم ثبت کرده ام را با کوئری دریافت کنم.لطفا راهنمایی بفرمایید.
با تشکر
در قسمت WHERE ستون ID باید برابر با یک مقدار باشد، به زبان ساده یعنی از جدول فلان مقدار ستون ID را در جایی که ID برابر با یک مقدار معین باشد انتخاب کن، مثال:
SELECT * FROM pays WHERE ID = 1
البته در ایجاد مقدار تصادفی ID باید دقت کنید که مقادیر تکراری نباشد (چون ID معمولا یک مقدار یکتا است!)، در روال معمول ID باید از نوع INT و به صورت AUTO_INCREMENT باشد!https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html
۱۶:۲۶ ۱۳۹۵/۰۹/۲۰
مممنون از توضیحتون
ولی متاسفانه من توی این قسمت اساسی گیر کردم متاسفانه اونقدر توی کد نویسی مهارت کامل رو ندارم یه نمونه شما برای من در این حد بدید که آی دی رو بررسی کنه اگه وجود داشت دستور ریدایرکت اجرا بشه...!
فقط در همین حد
ممنون میشم از کمکتون
ولی متاسفانه من توی این قسمت اساسی گیر کردم متاسفانه اونقدر توی کد نویسی مهارت کامل رو ندارم یه نمونه شما برای من در این حد بدید که آی دی رو بررسی کنه اگه وجود داشت دستور ریدایرکت اجرا بشه...!
فقط در همین حد
ممنون میشم از کمکتون
در بهینه ترین حالت می توانید از نمونه کدی مشابه کد زیر استفاده کنید:
<?php
$query = mysqli_query($conn, "SELECT id FROM tbl WHERE id = '$id' LIMIT 1");
//error
if(!$query) {
echo 'Error!';
}
//check id exist
$check_exist = mysqli_num_rows($query);
if($check_exist > 0) {
while($row = mysqli_fetch_array($query)) {
//your code
}
} //error
elseif($check_exist == 0) {
header("HTTP/1.0 404 Not Found");
echo '<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<html>
<head>
<meta http-equiv="Refresh" content="0; url=http://yourwebsite.com?code=404">
</head>
<body>لطفا چند لحظه صبر کنید...</body>
</html>';
}
?>
البته باید معنی دستوراتی که در سایتتان قرار می دهید را بدانید چون اغلب هماهنگ کردن کدهای آماده با ساختار سایت نیازمند کمی آشنایی با برنامه نویسی است، به طور مثال دستور اتصال به پایگاه داده یا پرس و جویی که در این کد انجام شده فرضی و صرفا جهت راهنمایی است، همچنین برای کدهای جدید بهتر است به جای توابع MySQL از MySQLi استفاده کنید (کمی با هم فرق دارند!).۱۵:۵۱ ۱۳۹۵/۰۹/۱۷
سلام خدمت مدیریت سایت وبگو
سوالی داشتم خدمتتون
من میخواستم بدونم مثلا ما یه سری مطلبا رو ارسال کردیم و توی دیتابیس ثبت شده حالا موقع خوندن به مشکل برخوردم البته مشکل جدی نیست من مطالب رو با آی دی فراخونی کردم الان میخوام کاری کنم که مثلا ما پستی با این آی دی داریم:
یک دنیا ممنون
سوالی داشتم خدمتتون
من میخواستم بدونم مثلا ما یه سری مطلبا رو ارسال کردیم و توی دیتابیس ثبت شده حالا موقع خوندن به مشکل برخوردم البته مشکل جدی نیست من مطالب رو با آی دی فراخونی کردم الان میخوام کاری کنم که مثلا ما پستی با این آی دی داریم:
http://iran-cidi.com/page.php?id=65
حالا میام تو مرورگر عدد آی دی رو عوض می کنم به جای 65 میذارم 70 خب من الان توی دیتابیس پستی با آی دی 70 ندارم و میخوام هر وقت این اتفاق افتاد عملیات ریدایرکت انجام بشه و به صفحه ایندکس ریدایرکت بشه ممنون میشم یه کمکی به بنده حقیر بکنید یه نمونه با mysql به صورت کامل میخوام که متوجه بشمیک دنیا ممنون
متاسفانه نمونه کاملی برای این مورد در اختیار نداریم اما می توانید با یک دستور SELECT و COUNT وجود ردیف مورد نظر را بررسی کنید (لطفا در این رابطه در وب جستجو نمائید)، در صورت عدم وجود آن ردیف با دستورات header در PHP خطای 403 یا ریدایرکت را تنظیم کنید:
header("HTTP/1.0 404 Not Found");
header("Location: http://yourwebsite.com");
علی
۲۰:۱۴ ۱۳۹۵/۰۶/۰۹
با سلام
یه سوال داشتم.
مثلا : فرض کنید من 7 ستون دارم (0 و 1 و 2 و 3 و ... و 6) در مای اسکیول همچنین با مبدل jdf روز هفته رو بدست میارم (یه عددی بین 0 تا 6) حالا میخوام اگه امروز شنبه (0) بود تو مای اسکیول جایی که ستون برابر شنبه (0) است رو مقدارشو اپدیت کنه بکنه 15 مثلا.
یه کدی شبیه این :
با تشکر
یه سوال داشتم.
مثلا : فرض کنید من 7 ستون دارم (0 و 1 و 2 و 3 و ... و 6) در مای اسکیول همچنین با مبدل jdf روز هفته رو بدست میارم (یه عددی بین 0 تا 6) حالا میخوام اگه امروز شنبه (0) بود تو مای اسکیول جایی که ستون برابر شنبه (0) است رو مقدارشو اپدیت کنه بکنه 15 مثلا.
یه کدی شبیه این :
mysqli_query($conn, "UPDATE amar SET $day='15' WHERE id='1' ");
لطفا کمک کنین.با تشکر
با توجه به توضیحات کافی است به جای استفاده از پارامتر id از پارامتر day (نام ستون مربوط به روز) استفاده کنید (البته در نمونه کد اشکال وجود دارد)، مثال:
UPDATE amar SET day='$day' WHERE day='0'
ندااا
۰۹:۵۱ ۱۳۹۵/۰۵/۱۳
سلام ممنونم از مطالب خوبتون، میخواستم بدونم چطور میشه از کاربر ورودی گرفت و اون رو با اطلاعات دیتابیس مقایسه کرد؟ شرط where چی باید باشه؟
برای این کار باید نحوه کار با فرم HTML و ارسال به سرور (کدهای PHP) را بلد باشید، برای نمونه عبارت "آموزش ساخت فرم عضویت در سایت با PHP و MySQL" را در وب جستجو نمائید!
نامدار
۱۶:۳۸ ۱۳۹۵/۰۲/۲۸
سلام
ببخشید من یه سوال داشتم:
اگه ما مقدار را به زبان فارسی وارد کنیم چرا در دستور select زمانی که شرط رو تعیین میکنیم (مثلا اطلاعات افرادی که اسم آنها سارا است) خروجی رو برنمیگردونه؟
یعنی این دستور:
ببخشید من یه سوال داشتم:
اگه ما مقدار را به زبان فارسی وارد کنیم چرا در دستور select زمانی که شرط رو تعیین میکنیم (مثلا اطلاعات افرادی که اسم آنها سارا است) خروجی رو برنمیگردونه؟
یعنی این دستور:
select * from tablename where name = 'سارا'
این موضوع به یونیکد و Collation دیتابیس شما بر می گردد، دقت کنید که اگر تمام مراحل زیر را انجام دهید، اطلاعات باید به شکل فارسی در دیتابیس ذخیره و (از طریق برنامه phpMyAdmin) قابل روئیت باشند:
در درجه اول باید Server connection collation دیتابیس را
- از متاتگ زیر در تمام صفحات استفاده کنید:
- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
در درجه اول باید Server connection collation دیتابیس را
utf8_persian_ci
انتخاب کنید، سپس مراحل زیر را انجام دهید:- از متاتگ زیر در تمام صفحات استفاده کنید:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- علاوه بر دیتابیس، جداول و ستون ها را نیز با یونیکدutf8_persian_ci
بسازید.- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
mysqli_query($conn, "SET NAMES 'utf8' ");
- اگر مشکل همچنان حل نشد، فایل های خود را با ویرایشگر ++Notepad باز کرده و سپس از قسمت Encoding گزینه Encoding UTF-8 without BOM را انتخاب و فایل خود را مجددا ذخیره نمائید.هادی
۱۷:۴۴ ۱۳۹۵/۰۱/۱۸
سلام به ادمین عزیز و کاربران سایت
دوتا سوال برام پیش اومده :
1- یک جدول داریم که بطور مثال فیلدهای userId , productId , userStatus , productStatus رو داره. میشه در این کوئری
2- یک جدول فروش داریم که ممکنه هر نوع محصول به چند نفر فروخته شده باشه و می خواهیم به ترتیب 10 محصول پرفروش را انتخاب کنیم کوئری اون به چه صورتی هست؟ لطفا یک روش بهینه ارائه کنید.
ممنون از سایت خوبتون
دوتا سوال برام پیش اومده :
1- یک جدول داریم که بطور مثال فیلدهای userId , productId , userStatus , productStatus رو داره. میشه در این کوئری
select count(userId),count(productId) from tblTest where
چطور دوتا شرط بنویسیم که برای count(userId) چک کنه userStatus!=0 و برای count(productId) مقدار productStatus!=0 رو چک کنه؟2- یک جدول فروش داریم که ممکنه هر نوع محصول به چند نفر فروخته شده باشه و می خواهیم به ترتیب 10 محصول پرفروش را انتخاب کنیم کوئری اون به چه صورتی هست؟ لطفا یک روش بهینه ارائه کنید.
ممنون از سایت خوبتون
برای سوال اول و نوشتن دو شرط در یک کوئری می توانید به شیوه نمونه زیر عمل کنید:
SELECT COUNT(userId) AS count FROM tbl WHERE userStatus != 0
UNION ALL
SELECT COUNT(productId) AS count FROM tbl WHERE productStatus != 0
در مورد بخش دوم سوال، ساختار دیتابیس شما مشخص نیست، با این حال با فرض اینکه id هر محصول در لیست فروش وجود داشته باشد، می توانید با دستور SELECT و GROUP BY و هچنین ASC و DESC این کار را انجام دهید، مثال:SELECT id, COUNT(id) AS id_occurrence FROM tbl GROUP BY id ORDER BY id_occurrence DESC LIMIT 10
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.