متد safequery در کلاس Db
شاید من 4 بار ویدیوی مربوط به امنیت آموزشها رو نگاه کردم. ولی هنوز متوجه نشدم که دقیقا کار اون علامت & که اول پارامتر sql$ استفاده میشه چی هست. اگه از دوستان کسی هست که بلده یه توضیح کوچولو بده. منظورم اون قسمته که کوئری ها رو پاس میدیم متد safequery انجام میده. چرا وقتی & نمیزاریم کوئری تغییر نمیکنه و مقادیر جایگزین نمیشن؟
private function safeQuery( & $sql, $data){
foreach ($data as $key=>$value){
$value = $this->connection->real_escape_string($value);
$value = "'$value'";
$sql = str_replace(":$key", $value, $sql);
}
return $this->connection->query($sql);
}
دوستان من خودم گشتم جواب سوالمو پیدا کردم ولی از اونجایی که نمیدونم چجوری باید این سوالو پاک کنم که برای بقیه قابل رویت نباشه سوالم تو این قسمت موند. یعنی راهی وجود نداره که سوالاتمون رو پاک کنیم؟
اول این مثال رو بخونید تا راحت تر درک کنید:
function add(&$num) { $num++; } $number = 0; add($number); echo $number; // this output => "1"
همونطور که میبینید مقداری توسط فانکشن برگشت داده نشده ولی مقدار متغیر عوض شده و این بخاطر اینه که
به جای ارسال مقدار متغیر به فانکشن آدرس متغیر ارسال میشه و در نتیجه مقدار متغیری که
در بیرون تابع هست هم تغییر میکنه
که اگه بخوام تو کدهای پروژه هم توضیح بدم اینطور میشه که برای مثال چون در متد safequery مقدار تغییر یافته متغیر sql$ به متدی که safequery رو صدا زده برگشت داده نمیشه، و فقط نتیجه کوئری ریترن میشه ، پس اگه نتیجه کوئری false باشه وبه متد صدا زننده safequery ارسال بشه، اگر ورودی تابع safequery به صورت پوینتری نباشه مقدار متغیر sql$ در متد صدازننده تغییر نخواهد کرد و کوئری به همون شکل تغییر نیافته در پیغام خطا ظاهر خواهد شد.یه تیکه از کد پروژه رو پایین میندازم که ببینید و راحتتر درک کنید.(امیدوارم منظور رو رسونده باشم)
private function safeQuery( & $sql, $data){
foreach ($data as $key=>$value){
$value = $this->connection->real_escape_string($value);
$value = "'$value'";
$sql = str_replace(":$key", $value, $sql);
}
return $this->connection->query($sql); // dar in ghesmat meghdare $sql return nashode ke dar peyghame khata meghdare taghir karde nemayesh dade beshe
}
public function query($sql, $data = array()){
$result = $this->safeQuery($sql, $data);
if (!$result) {
echo "Query: " . $sql . " failed due to " . mysqli_error($this->connection);
exit;
}
$records = array();
if ($result->num_rows == 0) {
return null;
}
while($row = $result->fetch_assoc()) {
$records[] = $row;
}
return $records;
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .