با سلام آیا میشود فقط برای ایجاد ارتباط با دیتابیس یک کلاس ایجاد کرد. و namespace مربوطه را در فایل مورد نظر use کرد؟
من قطعه کد زیر رو نوشتم اما وقتی میخوام مثلا در فایل لاگین بعد ارتباط از prepare استفاده کنم ارور میده.دلیل این ارور چی هست؟
./database.php
<?php
namespace App\Helpers;
use PDO;
class Database {
protected $db;
public function __construct() {
try {
$this->db =new PDO("mysql:host=localhost;dbname=pasak", "root", "");
// $this->db->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION);
} catch (Exception $e){
echo $e->getMessage();
}
return $this->db;
}
}
./login.php
use App\Helpers\Database;
$db = new Database();
$statm = $db->prepare("select * from admin where email = :email");
$statm->execute(compact('email'));
error :
Fatal error: Uncaught Error: Call to undefined method App\Helpers\Database::prepare() in C:\Users\SibCo\Desktop\pasak\login.php:27 Stack trace: #0 {main} thrown in C:\Users\SibCo\Desktop\pasak\login.php on line 27
خط 27 منظور prepare است.
پس از اجرای کوئری خود متغیر رو ریترن کنید ببینید مشکل حل میشه؟
$statm=$this->db->prepare("select * from {$this->tablename} where {$field} = {$param}");
$statm->execute($data);
return $statm;
لینک مستندات همراه با مثال
با سلام،
شما در کلاستون دارید کانکشن رو داخل یک پراپرتی به نام $db ذخیره میکنید.
سپس در پیج لاگین از روی کلاس دیتابیس یک آبجکت میسازید و اسم اون هم $db هست. حالا این $db جدید شامل یک آبجکتیه که خودش شامل متد ها و پراپرتی های کلاس Database هست.
$db = new Database(); // this is an object of Database class containing db property
نحوه صحیح فراخوانی چنین چیزی میشه.
$statm = $db->db->prepare("select * from admin where email = :email");
یا اینکه اسم پراپرتی رو در کلاس Database تغییر بدین مثلا به connection و بعد اینطور فراخوانی کنید.
$db = new Database();
$statm = $db->connection->prepare("select * from admin where email = :email")
همه این توضیحات اضافه رو دادم که متوجه مشکلی که وجود داشته بشین. این بهترین راه یادگیریه :))
موفق باشید
با سلام من کدها را تغییر دادم اما تو fetchارور میده که نمیتونه روی بولین fetch را انجام دهد.ممنون میشم در این رابطه هم کمک کنید.
database.php
<?php
namespace App\Tables;
use PDO;
class Database {
protected $db;
protected $tablename;
public function __construct() {
try {
$this->db =new PDO("mysql:host=localhost;dbname=pasak", "root", "");
// $this->db->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION);
} catch (Exception $e){
echo $e->getMessage();
}
return $this->db;
}
public function createprepare($data){
$field=array_keys($data);
$field=array_pop( $field);
$param=array_map(function($item){return ":$item";},array_keys($data));
$param=array_pop( $param);
//var_dump($field,$param,$this->tablename);die;
$statm=$this->db->prepare("select * from {$this->tablename} where {$field} = {$param}");
return $statm->execute($data);
}
}
login.php
$statm=$admin -> createprepare(compact('email'));
$user= $statm -> fetch(PDO:: FETCH_OBJ);
$id=$user->id;
error:Fatal error: Uncaught Error: Call to a member function fetch() on bool in C:\Users\SibCo\Desktop\pasak\login.php:38 Stack trace: #0 {main} thrown in C:\Users\SibCo\Desktop\pasak\login.php on line 38
در انتهای متد createprepare دارید نتیجه اجرا یا Execute کوئری رو برمیگردونید که این مورد Boolean هست
بله و برای همین خاطر نمیتونم به اطلاعات کاربرها دسترسی داشته باشم.
به نظرتون من چطور میتوتم این دسترسی را با توجه به این کدها بدست بیارم؟
پس از اجرای کوئری خود متغیر رو ریترن کنید ببینید مشکل حل میشه؟
$statm=$this->db->prepare("select * from {$this->tablename} where {$field} = {$param}");
$statm->execute($data);
return $statm;
لینک مستندات همراه با مثال
اقای دادخواه ایا این امکان وجود داره که به این شکل عمل کرد و پارامتری به متد کلاس پاس نداد اما انتظار جواب رو داشت؟
دقیقا مثل روال بالا باشه اما بدون ارسال پارمتر به شکلی که کل کاربرها را واکشی کنه?
.users.php
$select_stmt = $db->prepare("SELECT * FROM users");
$select_stmt->execute();
// $select_stmt=$Users -> createprepareall();
// var_dump($select_stmt);die;
.database.php
public function createprepareall(){
$select_stmt=$this->db->prepare("select * from {$this->tablename}");
return $select_stmt->execute();
}
بله. داخل مثال شما قاعدتا نباید مشکلی باشه. اما برای کوئری هایی که متغییر هایی رو باید حین اجرا بهشون ارسال کنید هم میتونید از طریق متد Execute این کار رو بکنید هم از طریق bindParams قبل از اجرا.
اینها از خصوصیات PDO هستن که با مطالعه مثال های مستندات اطلاعات خوبی دستگیرتون میشه.
این لینک ها رو ببینید:
لینک 1
لینک 2
با سلام آقای دادخواه ممنون میشم در این رابطه هم کمکم کنید.
من یک فرمی دارم که وقتی ادمین لاگین کرد بتونه به لیست افراد ثبت نام شده دسترسی داشته باشه و در ستون مربوط به ایدی و اسم و.. سلولی درست شده که اگر مثلا نوشتیم علی اسم کاربرهایی که علی هستند را برامون میاره.مساله ی که وجود داره این که کد درست کار میکنه اما وقتی ادمین لاگین میکنه فقط سلول ها دیده میشند که باید مثلا نوشت علی و اینتر زد بعد لیست تمام کاربران ثبت نامی و در بالا سطر مربوط به کاربرهایی که علی هست رو میاره.
در حالی که من میخوام وقتی ادمین لاگین کرد کل کاربرها لیست بشند و بعد بتونم جستجو بیارم و اینکه وقتی مثلا اسم رو جستجو میکنم و نتیجه رو میاره اما ارور مربوط به سایز سلول ها (نام خانوادگی ...)را طبق اروری که در پایین نوشتم میاره.
ایدی و اسم فقط نمونه ای از چندین مشخصات نوشته ام اینجا.
usersearch.php
<?php
require_once 'users.php';
?>
<body>
<table class="table table-bordered table-striped table-hover stara">
<thead>
<tr>
<th>آیدی</th>
<th>نام</th>
</tr>
<tr>
<th>
<form action="usersearch.php" method="post" >
<input name="searchid" >
</form>
</th>
<th>
<form action="/usersearch.php" method="post" >
<input name="searchname" >
</form>
</th>
</tr>
<?php while($user = $result-> fetch(PDO::FETCH_ASSOC )) { ?>
<tr class="bgyellow">
<th>
<?php echo $user['id'] ; ?>
</th>
<th>
<?php echo $user['name'] ; ?>
</th>
</tr>
<?php } ?>
</thead>
<tbody >
<?php while($row=$select_stmt->fetch(PDO::FETCH_ASSOC)){ ?>
<tr>
<td> <?php echo $row['id'] ; ?> </td>
<td> <?php echo $row['name'] ; ?> </td>
</tr>
<?php } ?>
</tbody>
</table>
</body>
</html>
users.php
<?php
$db = new PDO("mysql:host=localhost;dbname=pasak", "root", "");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$select_stmt = $db->prepare("SELECT * FROM users");
$select_stmt->execute();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if($_POST['searchid']){
$id=$_POST['searchid'];
$result = $db->prepare( "SELECT * FROM users WHERE id =:id");
$result->execute((compact('id')));
if($result ->rowCount() <1){
echo 'چنین کاربری وجود ندارد';
}
echo "</br>"; echo "</br>";
}
if($_POST['searchname']){
$name=$_POST['searchname'];
$result = $db->prepare( "SELECT * FROM users WHERE name =:name");
$result->execute((compact('name')));
if($result ->rowCount() <1){
echo 'چنین کاربری وجود ندارد';
}
echo "</br>"; echo "</br>";
}
}
}else{
echo 'مشاهده لیست کاربران امکان ندارد';
header('locaton:http://localhost:7000/index.php');
return;
?>
erorr
Warning: Undefined array key "searchname" in C:\Users\SibCo\Desktop\pasak\users.php on line 82
Warning: Undefined array key "searchfamily" in C:\Users\SibCo\Desktop\pasak\users.php on line 92
</body></html>
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟