انتخاب داده ها از پایگاه داده MySQL
دستور SELECT برای انتخاب داده از یک جدول استفاده می شود.
نحوه استفاده:
می توانیم با استفاده از نام ستون ها، تعداد محدودی از ستون های یک جدول را انتخاب کنیم:
یا می توانیم با استفاده از کاراکتر *، تمام ستون های یک جدول را انتخاب کنیم:
برای کسب اطلاعات بیشتر در مورد SQL، به لینک روبرو مراجعه فرمایید: آموزش SQL-مقدمه
انتخاب داده ها با استفاده از MySQLi
در مثال زیر، ستون های id و firstname و lastname از جدول MyGuests در صفحه نمایش داده خواهند شد:
مثال(MySQLi Object-oriented)
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ارتباط به پایگاه داده
$conn = new mysqli($servername, $username, $password, $dbname);
// مطمئن شدن از صحت ارتباط
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//تنظیم کوئری
$sql = "SELECT id, firstname, lastname FROM MyGuests";
//اجرای کوئری و قرار دادن نتیجه در متغیر
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// نمایش داده ها به ازای هر ردیف
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
//بستن ارتباط با پایگاه داده
$conn->close();
?>
خروجی کد بالا:
id: 2 - Name: Mary Moe
id: 3 - Name: Julie Dooley
توضیح مثال:
- ابتدا یک کوئری SQL را تنظیم کردیم که ستون های id و firstname و lastname از جدول MyGuests را انتخاب می کند. نتیجه اجرای کوئری توسط تابع ()query در متغیر result$ ذخیره می شود.
- حالا نتیجه کوئری در متغیر result$ است و می خواهیم که آنها را در خروجی نمایش دهیم، اما قبل از آن باید مطمئن شویم که کوئری ما نتیجه ای را در بر داشته است، بنابراین با استفاده از تابع ()num_rows چک می کنیم که ردیف ها بزرگتر از صفر باشد.
- با استفاده از تابع ()fetch_assoc ردیف اول داده ها برگردانده می شود، در یک اسکریبت با هر بار فراخوانی این تابع ردیف های بعدی بر می گردد.
- با استفاده از حلقه while و با هر بار فراخوانی تابع ()fetch_assoc نتیجه در متغیر row$ ذخیره می شود و این کار تا آخرین رکورد ادامه می یابد و اطلاعات ستون ها چاپ می شود.
در مثال زیر نیز با استفاده از روش MySQLi procedural ستون های id و firstname و lastname از جدول MyGuests در صفحه نمایش داده خواهند شد:
مثال(MySQLi Procedural)
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ایجاد ارتباط با پایگاه داده
$conn = mysqli_connect($servername, $username, $password, $dbname);
// اطمینان از صحت ارتباط
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
//تنظیم کوئری
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// نمایش داده ها به ازای هر ردیف
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
mysqli_close($conn);
?>
خروجی کد بالا:
id: 2 - Name: Mary Moe
id: 3 - Name: Julie Dooley
همچنین می توانید خروجی را در یک جدول HTML نمایش دهید:
مثال(MySQLi Object-oriented)
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ایجاد ارتباط با پایگاه داده
$conn = new mysqli($servername, $username, $password, $dbname);
// اطمینان از صحت ارتباط
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//تنظیم کوئری
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table><tr><th>ID</th><th>Name</th></tr>";
// نمایش داده ها به ازای هر ردیف
while($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["id"]."</td><td>".$row["firstname"]." ".$row["lastname"]."</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
$conn->close();
?>
خروجی کد بالا، البته با استایل زیر:
table, th, td {
border: 1px solid black;
}
</style>
خروجی:
ID | Name |
---|---|
1 | John Doe |
2 | Mary Moe |
3 | Julie Dooley |
انتخاب داده ها با استفاده از PDO + دستورات آماده
در مثال زیر، از دستورات آماده (prepared statements) استفاده شده است.
در مثال زیر نیز با استفاده از روش PDO ستون های id و firstname و lastname از جدول MyGuests در یک جدول HTMLی نمایش داده خواهند شد:
مثال(PDO)
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "\n";
}
}
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?>
خروجی کد بالا:
Id | Firstname | Lastname |
---|---|---|
1 | John | Doe |
2 | Mary | Moe |
3 | Julie | Dooley |
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
مثلا فرض کنید یک جدول person آیدیشو میخام بدم و یک اسم برام برگردونه
خواستم بدانم چطور میشود هر سطر را به صورت یک آرایه عددی برگشت داد؟
ولی به نظرم با تابع mysql_assoc_fetch و mysql_array_fetch بتونید کار موردنظر رو انجام بدید.
سؤالتون رو بیشتر توضیح بدید، تا دقیق بتونم بگم چطوری میشه انجامش داد.
دستورات php مثل خود تگ php را در بانک ذخیره میکنم ولی هنگام چاپ نمایش نمیده .
ممنون میشم اگه راههنمایی کنید
اگه کد بذارید، بهتره! ولی برای ذخیره دستورات php در دیتابیس بهتره، اون رو کد کنید یا اینکه اون رو داخل دابلکوتیشن بذارید و بعد ذخیره کنید.
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
برای توضیح باید شما تا حدودی به مفاهیم کلاس و شئگرایی مسلط باشید. خیلی ساده بگم، این خط تنظیمات خطا رو برای کار با این پایگاه داده و شی مذکور ست میکنه.
توی روش PDO میشه قسمت اول برنامه رو بیشتر توضیح بدین ؟
شما یه کلاس تشکیل دادین و ارث بری کردین و بعد تابع سازنده تعریف کردین !
ولی من اون قسمت رو متوجه نشدم که چرا اینطور نوشتین ! ممنون میشم بیشتر توضیح بدین :)
با تشکر از سایت خوبتون
توسط این کلاس آبجکت گرفته میشه و تبدیل به آرایه میشه. اگر دقت کنید در حلقه foreach از کلاس مربوطه استفاده شده که خروجی اون یه آرایه هست و این آرایه در حلقه استفاده میشه.
mysql_query("SET NAMES 'UTF8'");
www.beyamooz.com/php/339-project-hotel/2594
اگر تصور کنید اطلاعات را در یک جدول نمایش می دهید، به ازای ستون آخر باید بصورت زیر عمل کنید:
echo "<td><a href='all_user.php?delete_by_u_id=$u_id&action=delete' onclick='return confirm(\"آيا اطلاعات حذف شود؟\");'>حذف</a></td>";
همان طور که در کد بالا مشاهده می کنید، با استفاده از متد get، پارامتر "delete_by_u_id" که شامل ID ردیف مورد نظر است را به سرور ارسال کرده ایم ... در ادامه با استفاده از ID، ردیف حذف خواهد شد.
همان طور که در "Comment" قبلی هم ذکر شد، ویژگی href مربوط به لینک "حذف" بصورت زیر مقدار دهی شده است:href='all_user. php?delete_by_u_id=$u_id&action=delete' بنابراین زمانی که کاربر روی لینک "حذف" کلیک می کند، فایل "all_user.php" اجرا خواهد شد، اما توجه داشته باشید که دو پارامتر زیر نیز همراه با درخواست ما به سرور ارسال می شود:
1- delete_by_u_id : شامل ID یا شناسه ردیف است
2- action : این پارامتر، عملی که می خواهیم انجام دهیم، را مشخص می کند. بعنوان مثال برای لینک "ویرایش" این پارامتر با مقدار Update مقدار دهی شده است.
پس تا اینجا، ID و نوع عمل مشخص شد، تنها کافی است این مقادیر را سمت سرور دریافت کرده و عملیات مورد نظر را انجام دهیم.
اما نکته ی بسیار مهم در اینجا این است که، زمانی که درخواست اجرای all_user.php به سرور ارسال می شود، همزمان دو متغییر delete_by_u_id و action نیز ارسال خواهد شد.
به این روش ارسال متغییر get گفته می شود.
روش کار بسیار ساده است، یعنی برای ارسال پارامتر از این طریق به سرور باید بلافاصله بعد از نام فایل یک علامت سوال (؟) گذاشته و بعد نام پارامتر را ذکر کنید و بعد علامت مساوی (=) و نهایتاً مقدار پارامتر
نکته: اگر تعداد پارامترهای بیشتر از یکی است، باید بین هر پارامتر از علامت & استفاده کنید.<a href="/all_user.php?param_name01=Value01¶m_name02=Value02" >
Procedural در قسمت شرط نوشتيد:$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "";
}
}
درحالي ك $row قبلا تعريف نشده...سيستم چطور id هارو دونه ب دونه ميگيره و اطلاعاش رو چاپ ميكنه؟
خط 2: اگر تعداد ردیف های برگشتی بزرگتر از صفر بود، حلقه داخل if اجرا خواهد شد.
خط 3: هر بار که حلقه اجرا می شود، با استفاده از متد ()mysqli_fetch_as soc یکی از ردیف ها داخل متغییر row$ قرار می گیرد.
Fatal error: Call to a member function fetch_array() on a non-object in C:\xampp\htdocs\viewpage.php on line 36