m.mahmoudi
2 سال پیش توسط m.mahmoudi مطرح شد
10 پاسخ

یجاد ارتباط با دیتابیس

با سلام آیا میشود فقط برای ایجاد ارتباط با دیتابیس یک کلاس ایجاد کرد. و 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 است.


ثبت پرسش جدید
سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش مطرح شد
1

پس از اجرای کوئری خود متغیر رو ریترن کنید ببینید مشکل حل میشه؟

$statm=$this->db->prepare("select * from  {$this->tablename} where {$field} =  {$param}");
 $statm->execute($data);
return $statm;

لینک مستندات همراه با مثال


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش آپدیت شد
0

با سلام،

شما در کلاستون دارید کانکشن رو داخل یک پراپرتی به نام $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")

همه این توضیحات اضافه رو دادم که متوجه مشکلی که وجود داشته بشین. این بهترین راه یادگیریه :))
موفق باشید


m.mahmoudi
@m.mahmoudi7276 2 سال پیش مطرح شد
0

با سلام من کدها را تغییر دادم اما تو 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


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش مطرح شد
0

در انتهای متد createprepare دارید نتیجه اجرا یا Execute کوئری رو برمیگردونید که این مورد Boolean هست


m.mahmoudi
@m.mahmoudi7276 2 سال پیش مطرح شد
0

بله و برای همین خاطر نمیتونم به اطلاعات کاربرها دسترسی داشته باشم.
به نظرتون من چطور میتوتم این دسترسی را با توجه به این کدها بدست بیارم؟


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش مطرح شد
1

پس از اجرای کوئری خود متغیر رو ریترن کنید ببینید مشکل حل میشه؟

$statm=$this->db->prepare("select * from  {$this->tablename} where {$field} =  {$param}");
 $statm->execute($data);
return $statm;

لینک مستندات همراه با مثال


m.mahmoudi
@m.mahmoudi7276 2 سال پیش مطرح شد
0

بله کاملا درست عمل کرد بسیار ممنونم.


m.mahmoudi
@m.mahmoudi7276 2 سال پیش مطرح شد
0

اقای دادخواه ایا این امکان وجود داره که به این شکل عمل کرد و پارامتری به متد کلاس پاس نداد اما انتظار جواب رو داشت؟
دقیقا مثل روال بالا باشه اما بدون ارسال پارمتر به شکلی که کل کاربرها را واکشی کنه?

.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();
    }

سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش آپدیت شد
0

بله. داخل مثال شما قاعدتا نباید مشکلی باشه. اما برای کوئری هایی که متغییر هایی رو باید حین اجرا بهشون ارسال کنید هم میتونید از طریق متد Execute این کار رو بکنید هم از طریق bindParams قبل از اجرا.
اینها از خصوصیات PDO هستن که با مطالعه مثال های مستندات اطلاعات خوبی دستگیرتون میشه.
این لینک ها رو ببینید:
لینک 1
لینک 2


m.mahmoudi
@m.mahmoudi7276 2 سال پیش مطرح شد
0

ممنونم بررسی میکنم


m.mahmoudi
@m.mahmoudi7276 2 سال پیش مطرح شد
0

با سلام آقای دادخواه ممنون میشم در این رابطه هم کمکم کنید.
من یک فرمی دارم که وقتی ادمین لاگین کرد بتونه به لیست افراد ثبت نام شده دسترسی داشته باشه و در ستون مربوط به ایدی و اسم و.. سلولی درست شده که اگر مثلا نوشتیم علی اسم کاربرهایی که علی هستند را برامون میاره.مساله ی که وجود داره این که کد درست کار میکنه اما وقتی ادمین لاگین میکنه فقط سلول ها دیده میشند که باید مثلا نوشت علی و اینتر زد بعد لیست تمام کاربران ثبت نامی و در بالا سطر مربوط به کاربرهایی که علی هست رو میاره.
در حالی که من میخوام وقتی ادمین لاگین کرد کل کاربرها لیست بشند و بعد بتونم جستجو بیارم و اینکه وقتی مثلا اسم رو جستجو میکنم و نتیجه رو میاره اما ارور مربوط به سایز سلول ها (نام خانوادگی ...)را طبق اروری که در پایین نوشتم میاره.
ایدی و اسم فقط نمونه ای از چندین مشخصات نوشته ام اینجا.
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>


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام