حل شده درخواست کد php ( متشکرم از راهنمایی دوستان )
#31
(1398/12/19، 08:06 عصر)""M.gh نوشته است:
(1398/12/19، 12:12 صبح)Master Badfar نوشته است:
لازم نبود یک فایل جدا برای اضافه کردن به مقدار امتیاز کاربر در تیبل دیتابیس بسازی و میشه با یک فایل هم سر و تهش رو هم آورد!
پس من با همین منطق کد رو برات نوشتم طوری که با یک فایل بتونی هم نام کاربر صاحب امتیاز رو نشون بدی و هم در صورت نیاز به مقدار امتیازش اضافه کنی و مقدار جدید رو در دیتابیس ذخیره کنی.
طبق گفته های خودت در ابتدای تاپیک من فرض کردم مشخصات دیتابیس همونطوری هست که قبل تر گفتی و همچنین فرض کردم که
 مقدار امتیاز کاربر عددی هست.
ممکنه در ادامه به کلمه «آرگومان» برخورد کنی که یعنی همون ورودی...
اما کد به این شرحه:
کد php:
<?php

/**
* @author Master Badfar
* @copyright 2020
*/

// صدور مجوزها برای مرورگـر
header('Content-Type: text/html; charset=utf-8');
header('Access-Control-Allow-Origin: *'); 
 // و ذخیره آن در متغیر دریافت ورودی امتیاز کاربر
$score$_GET['score'];
// دریافت میزان مورد نیاز برای اضافه کردن به امتیاز و ذخیره در متغیر
$add $_GET['add'];
// متغیر نشاندهنده موفقیت آمیز بودن ریکوئست 
$valid 0;
// کانفیگ دیتابیس
$conn mysqli_connect("localhost""db-1399""m.gh","db-1399");
// درصورت بروز خطا
if (!$conn) {
 die("Connection failed: " mysqli_connect_error());
}
// تنظیم دستور اس کیو ال برای دریافت نام کاربر از روی امیتاز ثبت شده در متغیر
$sql "SELECT `name` FROM `db-1399` WHERE `score` = '$score'";
$result mysqli_query($conn$sql);
if (
mysqli_num_rows($result) >  0 && isset($add)) {
   $row mysqli_fetch_assoc($result);
   // نمایش نام کاربر
   if (isset($row)){
   echo "The name is:" " " $row['name'];
   // ذخیره نام کاربر در متغیر
   $name $row['name'];
   // اضافه کردن به مقدار متغیر موفقیت آمیز بودن ریکوئست (یک عدد)
   $valid++;
   }
   }
   // در صورت موجود نبودن امتیاز وارده در دیتابیس
    if (!isset($row)){
       echo "The entered score is not available in database!";
}
// اگر مقدار مورد نیاز برای اضافه کردن امتیاز در آرگومان وارده توسط کاربر بیشتر از صفر بود و توانستیم در مرحله قبل نام کاربر را دیافت کنیم یا به عبارتی دیگر مقدار متغیر موفقیت یک شد
if ($add && $valid == 1){
   // تعریف متغیر final value و تنظیم مقدار آن با در نظر گرفتن مقدار مورد نظر برای اضافه شدن به امتیاز
   $final_value $score $add;
// تنظیم دستور مای اس کیو اِل
   $sql "UPDATE db-1399 SET score='$final_value' WHERE name='$name'";
}
if (
$conn->query($sql) === TRUE) {
   // ایجاد فاصله بین پیغام قبل
   echo '</br>';
   // نمایش پیغام موفقیت آمیز بودن
   echo "The score changed form . " "  . $score . " " . "to" . " " . $final_value . " " . "by adding" . " " . $add . " " . "numbers to the first score value." ;
}
// بستن اتصال به دیتابیس
$conn->close();
?>
توضیحات راجع به خروجی کـد:
در صورتی که آرگومان امتیاز وارده در دیتابیس وجود نداشت خروجی به این شکله:
کد:
The entered score is not available in database!
اگر صرفاً قصد نمایش نام صاحب امتیاز رو داشته باشی خروجی کد به این شکله:
کد:
The name is : "name"
میتونی توی محیط کانستراکت با استفاده از اکسپرشن سیستم tokenat و با تنظیم پارامترهای seperator روی ":" و index روی 1 مقدار نام رو دریافت کنی. البته میدونم که با این اکسپرشن آشنا هستی.
اگر علاوه بر نمایش مقدار نام صاحب امتیاز قصد اضافه کردن به امتیاز فعلی رو داشته باشی چنین خروجی رو شاهد خواهی بود:
(فرض کن نام کاربر reza باشه و امتیاز فعلی هم 41 باشه)
کد:
The name is: reza
The score changed form 41 to 43 by adding 2 numbers to the first score value.
خط دوم کاملاً مشخصه که به ما میگه مقدار امتیاز کاربر از 41 به 43 تغییر کرد با اضافه شدن دو واحد!
توضیحات راجع به فرمت آدرس ریکوئست:
 در حالتی که قصد داری هیچ چیز به مقدار امتیاز اضافه نکنی و صرفاً قصد نمایش نام رو داری فرمت آدرس ریکوئست رو به این شکل وارد کن: 
کد:
http://yourhost.com/file.php?score=x&add=0
به جای مقدار ایکس توی آدرس مقدار امتیاز موردنظر رو وارد کن. حالا اگر قصد داشتی به مقدار امتیاز چیزی اضافه کنی و تغییر رو توی دیتابیس ثبت کنی فرمت آدرس ریکوئست رو به این شکل وارد کن:
کد:
http://yourhost.com/file.php?score=x&add=y
 اینجا x همون مقدار امتیاز مورد نظر هست و y هم مقداری هست که قصد داری به امتیاز کنونی کاربر اضافه کنی...
یه نکته راجع به این قسمت هست و اونم اینه که تو اگر مقدار پارامتر add رو از صفر بیشتر وارد کنی یعنی مثلاً بزنی 0.5 کد اجرا میشه قسمت دومش و به مقدار متغیر کاربر 0.5 تا اضافه میکنه اما توی دیتابیس چون نوع داده رو روی int تنظیم کردی رکوردی که نمایش داده میشه اعشاری نیست و گرد میشه به بالا.
پ.ن: توصیه میکنم از متد get استفاده نکن چون از تاخت و تاز هکرها در امان نیستی! پس بهتره از متد post استفاده کنی که البته لازمه یک تغییر هم در فرمت آدرس ریکوئست ها و هم در متغیرهای گلوبال کد php بدی. در کل متد get برای تبادل داده های نه چندان حیاتی مناسبه و اینکه کجا از متد get بهتره استفاده بشه و یا متد post رو دیگه باید
خودت تشخیص بدی!

سعی کردم کدی که نوشتم رو کامنت گذاری کنم تا فهمش برات بهتر بشه.
موفق باشی 1 

(1398/12/19، 02:59 عصر)Master Badfar نوشته است:
(1398/12/18، 08:57 عصر)""M.gh نوشته است: سلام
یک سوال کوچولو ی دیگه داشتم ، مثلا دیتابیس ما به این شکل :

                                    name                           score
  
                                     1330                             mahdi             

بعد الان سوال من اینه که مثلا ما به یک فایل php به نام add داریم که وقتی به اون ایجوری پست می کنیم :

                          
                                                                    
                    https//:rezamms.ir/add.php?add=4&name=mahdi


بعد تو نیم mahdi و تو add عددی که میخوایم به 1330 اضافه بشه که بشه  1334 .

حالا من از شما میخوام بی زحمت فایل php اش رو بدین  4





 


در ضمن اینکه اومدی رکوردها رو همینطوری به صورت plaintext در داخل دیتابیس ذخیره کردی  از نظر امنیتی درست نیست چرا که اگر هکر بتونه به دیتابیس تو نفوذ کنه همه چی براش هلو تو گلویه!
پس لازمه از متدهای رمزنگاری استفاده کنی حالا یا در سمت کانستراکت یا در سمت php...
میتونی از یک متد ساده ولی نسبتاً مناسب توی php به نام openssl استفاده کنی. کدش این شکلی میشه:
(بد نیست بدونی این روش همون رمزنگاری با AES-128 هست!)
کد php:
<?php
// تنظیم پارامترهای متد رمزنگاری openssl
$ciphering "AES-128-CTR"
$iv_length openssl_cipher_iv_length($ciphering); 
$options 0
//تنظیم پارامتر iv
$encryption_iv '1234567891011121'
// تنظیم کلید رمزنگاری
$encryption_key 'U^9k~aQT%hWS<g)#x)2@mc7Yfn~bjmGdUKpAcy[QM^)=^6NC+CPb}/9>HEZ;fSA%Dwy>u!pq<=+)IGi[P;*(AbeZPzQ=pcKwaCb9#U![}fQYX)ul3n>N)!,8UscPD@;q'
// رمزنگاری عبارت دلخواه
$encrypted_string openssl_encrypt($_GET['string'], $ciphering
           $encryption_key$options$encryption_iv);
echo 
$encrypted_string;
?>
خُب همینطور که میبینی میتونی کلیدرمزنگاری رو هر چی که خواستی قرار بدی و هر چی طولانی تر باشه بهتر. من یک عبارت تصادفی رو جنریت کردم و به عنوان کلید رمزنگاری قرار دادم که غیرقابل حدس باشه و هکر برای دستیابی به اون هم با حملاتی مثل بروت فورس و یا وردلیست نتیجه شاخصی نگیره.
در کدی که بالا نوشتم برای اینکه عبارت یا رشته موردنظرت رو به این روش رمز کنی کافیه یک ریکوئست با این فرمت ارسال کنی:
کد:
http://yourhost.com/file.php?string=x
به جای عبارت x میتونی هر چیزی که دلت خواست قرار بدی تا رمز بشه
اما خوبی این متد رمزنگاری اینه که قادر به رمزگشایی هم هستیم و مثل الگوریتم درهم سازی یا هش کردن پروسه یک طرفه نیست(البته میشه عبارات متداول رو De-Hash کرد در ضمن بعضی از متدهای هش کردن مثل md5 هم این روزا دیگه ایمن شناخته نمیشن)
کد رمزگشایی به این شکله:
کد php:
<?php
// تنظیم پارامترهای متد رمزنگاری openssl
$ciphering "AES-128-CTR"
$iv_length openssl_cipher_iv_length($ciphering); 
$options 0
//تنظیم پارامتر iv
$decryption_iv '1234567891011121'
// تنظیم کلید رمزگشایی
$decryption_key 'U^9k~aQT%hWS<g)#x)2@mc7Yfn~bjmGdUKpAcy[QM^)=^6NC+CPb}/9>HEZ;fSA%Dwy>u!pq<=+)IGi[P;*(AbeZPzQ=pcKwaCb9#U![}fQYX)ul3n>N)!,8UscPD@;q'
// رمزگشایی عبارت دلخواه
$decrypted_string openssl_decrypt ($_GET['string'], $ciphering 
       $decryption_key
$options$decryption_iv);
       // نمایش عبارت رمزگشایی شده
echo $decrypted_string;
?>
با ارسال چنین ریکوئستی و قرار دادن عبارت رمز شده ای که در مرحله رمزنگاری دریافت کردی به جای x میتونی عبارت موردنظر رو رمزگشایی کنی:
کد:
http://yourhost.com/file.php?string=x
فقط باید حواست باشه که برای رمزنگاری و رمزگشایی از یک کلید یکسان استفاده میشه توی این متد پس همین باعث میشه زیاد ایمن نباشه چون کلید عمومی و خصوصی در کار نیست و رمزنگاری متقارن محسوب میشه ولی در حد پروژه های معمول متد بدی نیست.
علاوه بر اون کدی که من نوشتم و کدی که دوستان زحمت کشیدن دادن در برابر حمله ای مثل SQL Injection ایمن نیست چرا که اگر کاربر کاراکترهای غیرمجازی رو که به عنوان کوئری MySQL تلقی بشه وارد کنه خیلی راحت میتونه کوئری های دلخواه خودش رو اعمال کنه. پس لازمه کاراکترهای ورودی رو روشون کنترل داشته باشی که یک وقت علائم غیر مجاز نداشته باشه حالا یا در سمت کانستراکت یا در سمت php که بهترین کار تنظیم در سمت php هست.
 


ممنون عالی بود . فقط در مورد پست اولی میشه به جای وارد کردن score نیم رو وارد کنیم و score اون نیم ای که وارد کردیم بهش add کنیم؟؟

از آقا رضا هم بسیار ممنونم


بله چرا نشه ولی باید کد ادیت بشه یه مقداری
غایب
  پاسخ


 سپاس شده توسط: M.gh
#32
خب شما که انقدر زحمت کشیدی بگو چجوری میشه؟
  پاسخ


 سپاس شده توسط: tairon
#33
مرسی خودم حلش کردم  4 






فقظ یک سوال کوچولو ی دیگه فقط کدش رو بگین لازم نیست زحمت بکشین و توضیح بدهید ، دوباره ما یک دیتابیس داریم :

                              name                           score
                              1330                             mahdi 

حالا ما مثلا اینو  request می کنیم :

کد:
www.myhost.ir/file.php?name=x


حالا ما اون x رو مثلا mahdi وارد می کنیم ،  بعد اگه mahdi تو دیتابیس بالا بود ، یه چیزو به ما echo کنه اگه نبود یه چیزو echo کنه .
حالا فقط کد php اش رو میخوام ، ببخشید خیلی زحمت دادم ، حبران می کنم  4  ( جبران کردم ، بیشتر جبران می کنم )
  پاسخ


 سپاس شده توسط: tairon
#34
خب همینجوری بدون درج  کد بنویس  4

هم میشه کد بنویسی هم هایپرلینک کنی .
  پاسخ


 سپاس شده توسط: tairon
#35
این چیه؟  4
  پاسخ


 سپاس شده توسط: tairon
#36
(1398/12/19، 10:25 عصر)Master Badfar نوشته است:
(1398/12/19، 10:22 عصر)""M.gh نوشته است: این چیه؟  4

همونی که میخواستی.
اسم رو وارد میکنی و بهت امتیاز رو نمایش میده.
در نظر داشته باش که برای پروسه اضافه کردن امتیاز آدرس ریکوئست رو به همون شکلی که توی کد اولیه گفتم بزن فقط به جای score بزار name.
خروجی ها دقیقاً مشابه کد اول هست منتها شخصی سازی شده برای نمایش نام کاربر.


24

داداش خدا خیرت بده جواب میدی ولی سوالو درست بخون  3

با اجازه اینو یاد داشتم  سوالی که من پرسیدم این بود :

فقظ یک سوال کوچولو ی دیگه فقط کدش رو بگین لازم نیست زحمت بکشین و توضیح بدهید ، دوباره ما یک دیتابیس داریم :

                              name                           score
                              1330                             mahdi 

حالا ما مثلا اینو  request می کنیم :


کد:
www.myhost.ir/file.php?name=x


حالا ما اون x رو مثلا mahdi وارد می کنیم ،  بعد اگه mahdi تو دیتابیس بالا بود ، یه چیزو به ما echo کنه اگه نبود یه چیزو echo کنه، در واقع اگه تو دیتابیس موجود بود 1 رو به ما برگردونه اگه نبود 2 رو .
حالا فقط کد php اش رو میخوام ، ببخشید خیلی زحمت دادم ، حبران می کنم   3   ( جبران کردم ، بیشتر جبران می کنم )


  پاسخ


 سپاس شده توسط: tairon
#37
خب شما میگی که
همونی که میخواستی.

اسم رو وارد میکنی و بهت امتیاز رو نمایش میده.

خب من اینو نگفتم  2
  پاسخ


 سپاس شده توسط: tairon
#38
(1398/12/19، 10:31 عصر)""M.gh نوشته است: خب شما میگی که
همونی که میخواستی.

اسم رو وارد میکنی و بهت امتیاز رو نمایش میده.

خب من اینو نگفتم  2

یعنی فقط میخوای بدونی که اگر نام mahdi وجود نداشت پیام بده که وجود ندارد و اگر وجود داشت پیام بده وجود دارد؟
اگر اینطوره این از کد:
کد php:
<?php

/**
* @author Master Badfar
* @copyright 2020
*/

// صدور مجوزها برای مرورگـر
header('Content-Type: text/html; charset=utf-8');
header('Access-Control-Allow-Origin: *'); 
 
// و ذخیره آن در متغیر دریافت ورودی امتیاز کاربر
$name$_GET['name'];
// کانفیگ دیتابیس
$conn mysqli_connect("localhost""db-1399""m.gh","db-1399");
// درصورت بروز خطا
if (!$conn) {
 die(
"Connection failed: " mysqli_connect_error());
}
// تنظیم دستور مال اس کیو اِل
$sql "SELECT `score` FROM `Game1` WHERE `name` = '$name'";
$result mysqli_query($conn$sql);
if (
mysqli_num_rows($result) >  0) {
   
$row mysqli_fetch_assoc($result);
   
// اگر موجودبود
   
if (isset($row['score'])){
   echo 
"The name ' " "  " $name "  " " ' is available.";
   }
   }
   
// در صورت موجود نبودن امتیاز وارده در دیتابیس
    
if (!isset($row['score'])){
      echo 
"The name ' " "  " $name "  " " ' is  not available.";
}
// بستن اتصال به دیتابیس
$conn->close();
?>
مـوفـق بـاشی
غایب
  پاسخ


 سپاس شده توسط: mahdi.p ، M.gh
#39
(1398/12/19، 10:53 عصر)Master Badfar نوشته است:
(1398/12/19، 10:31 عصر)""M.gh نوشته است: خب شما میگی که
همونی که میخواستی.

اسم رو وارد میکنی و بهت امتیاز رو نمایش میده.

خب من اینو نگفتم  2

یعنی فقط میخوای بدونی که اگر نام mahdi وجود نداشت پیام بده که وجود ندارد و اگر وجود داشت پیام بده  وجود دارد؟
اگر اینطوره این از کد:
کد php:
<?php

/**
* @author Master Badfar
* @copyright 2020
*/

// صدور مجوزها برای مرورگـر
header('Content-Type: text/html; charset=utf-8');
header('Access-Control-Allow-Origin: *'); 
// و ذخیره آن در متغیر دریافت ورودی امتیاز کاربر
$name$_GET['name'];
// کانفیگ دیتابیس
$conn mysqli_connect("localhost""db-1399""m.gh","db-1399");
// درصورت بروز خطا
if (!$conn) {
die(
"Connection failed: " mysqli_connect_error());
}
// تنظیم دستور مال اس کیو اِل
$sql "SELECT `score` FROM `Game1` WHERE `name` = '$name'";
$result mysqli_query($conn$sql);
if (
mysqli_num_rows($result) >  0) {
  $row mysqli_fetch_assoc($result);
  // اگر موجودبود
  if (isset($row['score'])){
  echo "The name ' " "  " $name "  " " ' is available.";
  }
  }
  // در صورت موجود نبودن امتیاز وارده در دیتابیس
   if (!isset($row['score'])){
     echo "The name ' " "  " $name "  " " ' is  not available.";
}
// بستن اتصال به دیتابیس
$conn->close();
?>
مـوفـق بـاشی


آقا ایول همینو میخواستم ، ممنونم فرشته ی نجاتم  4
  پاسخ


 سپاس شده توسط: tairon
#40
برای کدگذاری اطلاعات میشه از  replace خود کانس استفاده کنیم ؟
  پاسخ


 سپاس شده توسط: tairon


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  حل شده خرید درون برنامه مایکت در وب ویو Arianm 3 889 1402/4/25، 12:01 عصر
آخرین ارسال: Arianm
Wink سیستم شخصی سازی خودرو Arianm 1 407 1402/4/24، 05:21 عصر
آخرین ارسال: SHAMIRZA
  علت بازی نشدن وقتی نصب شده amirhosseinalizadehgharebaba81 1 329 1402/4/23، 02:22 عصر
آخرین ارسال: (:--ALI--:)
  چگونگی اجرا بازی روی ه‍است ایران (:--ALI--:) 8 1,476 1402/3/24، 04:50 عصر
آخرین ارسال: (:--ALI--:)
  وصل شدن به روح هاست قبلی :) amirhosseinalizadehgharebaba 2 2,038 1401/11/2، 09:43 عصر
آخرین ارسال: amirhosseinalizadehgharebaba

پرش به انجمن: