اذهب إلى المحتوى
  • 0

الاستعلامات MySQL with php مع شرط ديناميكي ( جزء إجباري و جزء اختياري)

Flutter Dev

السؤال

قمت بوضع استعلام ويحتوي على شرطين WHERE 

احتاج ان اجعل الكود يعمل بشكل صحيح لو تحقق اول شرط ولم يتحقق الشرط الثاني بمعنى واحد اجباري وثاني اختياري

بمعنى انا قمت بوضع الشرط الأول وهو جلب البيانات التي id  لها يساوي كذا هذا شرط اجباري طبعا

اما الثاني اجلب لي الداتا التي لونها اخضر مثلا هذا شرط اختياري حتى لو المستخدم لم يقم بأرساله الى ملف php الملف يجب ان يعمل بشكل صحيح 

الكود المستعمل كالتالي:

<?php
require_once 'con.php';

$id=$_GET['id'];
$Uid=$_GET['Uid'];

$sql="SELECT  * FROM books


where id = ? AND Uid=? " ;


$stmt = $con->prepare($sql); 

$stmt->bind_param("ss",$id,$Uid);

$stmt->execute();

$result = $stmt->get_result();



if ($result->num_rows >0) {
 
 
	 while($row[] = $result->fetch_assoc()) {
	 
	 $item = $row;
	 
	 $json = json_encode($item, JSON_NUMERIC_CHECK);
	 
	 }
 
} else {

    $json = json_encode(["result" => "No Data Foun"]);
}
 echo $json;
$con->close();


?>

الشرط الأول هذا يجب ان يكون اجباري او الملف لن يعمل :

$id=$_GET['id'];

 

 

اما الشرط الثاني وهو الاختياري لا يهم الملف استقبله او لا وفي حالة استقباله يتم تنفيذه


$Uid=$_GET['Uid'];

 

كيف يمكن عمل ذلك ؟ هل توجد طريقة
 

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكنك باستخدام الأمر 

$isTouch = isset($Uid);

أن تتأكد إذا كان المتحول Uid معرفاً أم لا.

ثم أضف if شرطية في حال كان معرفاً نفذ أمر جلب البيانات معه، وإذا كان غير معرفاً من دونه، أي عوضا عن الكود :


$sql="SELECT  * FROM books


where id = ? AND Uid=? " ;

اكتب الكود: 


if (isset($variable)) {
  	$sql="SELECT  * FROM books
	where id = ? AND Uid=? " ;
}else {
  	$sql="SELECT  * FROM books
	where id = ?" ;
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

ما فائدة الشرط الثاني منطقياً في الاستعلام؟ أرجو إعطاء مثال

برأيي إضافة الشرط الثاني برمجيا لعبارة SQL 

$sql="SELECT  * FROM books where id = ?";

if ($Uid) 
	$sql .= "AND Uid=?"

هكذا يصبح Uid اختياري بالشرط حسب إن أدخله المستخدم أم لا.

وسوف تعدل الشيفرة أيضاً في bind_param وتمرير عدد متغيرات كما أسلفت

<?php

if (isset($Uid)) {
  $sql="SELECT  * FROM books
	where id = ? AND Uid=? " ;

  $stmt = $con->prepare($sql); 

  $stmt->bind_param("ss",$id,$Uid);

}else {
  $sql="SELECT  * FROM books
	where id = ?" ;
  $stmt = $con->prepare($sql); 

  $stmt->bind_param("s",$id);
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ منذ ساعة مضت قال مروان مروان3:

اهلا اخي

الفكرة انني سوف اجلب favorite من جدول ال favorite لو كان تم إضافة favorite للكتاب ولو لم يكن تم عمل favorite له يعمل skip  له 

من فضلك تصوير قاعدة البيانات مع الجدولين و بعض البيانات فيهم ثم ذكر مثال، ربما الفكرة بشكل عام تطبيقها مختلف؟

هل id و uid من نفس الجدول؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

أهلا بك.

بتاريخ 2 ساعات قال مروان مروان3:

مرحبا اخي الكريم

قمت بوضع الكود بشكل التالي:

 


<?php
require_once 'con.php';

$id='14';
$isTouch = isset($Uid);

if (isset($Uid)) {
  	$sql="SELECT  * FROM books
	where id = ? AND Uid=? " ;
}else {
  	$sql="SELECT  * FROM books
	where id = ?" ;
}


$stmt = $con->prepare($sql); 

$stmt->bind_param("ss",$id,$Uid);

$stmt->execute();

$result = $stmt->get_result();
if ($result->num_rows >0) {
 
	 while($row[] = $result->fetch_assoc()) {
	 
	 $item = $row;
	 
	 $json = json_encode($item, JSON_NUMERIC_CHECK);
	 
	 }
 
} else {

    $json = json_encode(["result" => "No Data Foun"]);
}
 echo $json;
$con->close();


?>

ولكني احصل على الخطاء التالي:


Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /home/home/****************php on line 30 on line 22

Notice: Trying to get property 'num_rows' of non-object in /home/****************php on line 30
{"result":"No Data Foun"}

 

هذا تحذير وضعه المترجم والسبب بما أنه هناك احتمالين في البرنامج إما أن تأخذ متحولين id و Uid أو فقط id فيجب أن تتأكد من عدد المتحولات التي ستدخلها في bind_param إما أن تكون اثنين أو واحد فقط. 

// $stmt->bind_param("ss",$id,$Uid); استبدل هذا الكود بالشرط

if (isTouch) {
	$stmt->bind_param("ss",$id,$Uid);
} else{
	$stmt->bind_param("ss",$id);
}

 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 دقائق مضت قال معاذ قره محمد:

يمكنك باستخدام الأمر 


$isTouch = isset($Uid);

أن تتأكد إذا كان المتحول Uid معرفاً أم لا.

ثم أضف if شرطية في حال كان معرفاً نفذ أمر جلب البيانات معه، وإذا كان غير معرفاً من دونه، أي عوضا عن الكود :



$sql="SELECT  * FROM books


where id = ? AND Uid=? " ;

اكتب الكود: 



if (isset($variable)) {
  	$sql="SELECT  * FROM books
	where id = ? AND Uid=? " ;
}else {
  	$sql="SELECT  * FROM books
	where id = ?" ;
}

 

مرحبا اخي الكريم

قمت بوضع الكود بشكل التالي:

 

<?php
require_once 'con.php';

$id='14';
$isTouch = isset($Uid);

if (isset($Uid)) {
  	$sql="SELECT  * FROM books
	where id = ? AND Uid=? " ;
}else {
  	$sql="SELECT  * FROM books
	where id = ?" ;
}


$stmt = $con->prepare($sql); 

$stmt->bind_param("ss",$id,$Uid);

$stmt->execute();

$result = $stmt->get_result();
if ($result->num_rows >0) {
 
	 while($row[] = $result->fetch_assoc()) {
	 
	 $item = $row;
	 
	 $json = json_encode($item, JSON_NUMERIC_CHECK);
	 
	 }
 
} else {

    $json = json_encode(["result" => "No Data Foun"]);
}
 echo $json;
$con->close();


?>

ولكني احصل على الخطاء التالي:

Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /home/home/****************php on line 30 on line 22

Notice: Trying to get property 'num_rows' of non-object in /home/****************php on line 30
{"result":"No Data Foun"}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال Wael Aljamal:

ما فائدة الشرط الثاني منطقياً في الاستعلام؟ أرجو إعطاء مثال

برأيي إضافة الشرط الثاني برمجيا لعبارة SQL 


$sql="SELECT  * FROM books where id = ?";

if ($Uid) 
	$sql .= "AND Uid=?"

هكذا يصبح Uid اختياري بالشرط حسب إن أدخله المستخدم أم لا.

وسوف تعدل الشيفرة أيضاً في bind_param وتمرير عدد متغيرات كما أسلفت


<?php

if (isset($Uid)) {
  $sql="SELECT  * FROM books
	where id = ? AND Uid=? " ;

  $stmt = $con->prepare($sql); 

  $stmt->bind_param("ss",$id,$Uid);

}else {
  $sql="SELECT  * FROM books
	where id = ?" ;
  $stmt = $con->prepare($sql); 

  $stmt->bind_param("s",$id);
}

 

اهلا اخي

الفكرة انني سوف اجلب favorite من جدول ال favorite لو كان تم إضافة favorite للكتاب ولو لم يكن تم عمل favorite له يعمل skip  له 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 ساعات قال Wael Aljamal:

من فضلك تصوير قاعدة البيانات مع الجدولين و بعض البيانات فيهم ثم ذكر مثال، ربما الفكرة بشكل عام تطبيقها مختلف؟

هل id و uid من نفس الجدول؟

اهلا اخي الكريم

حقيقه كنت أحاول عمل اختصار لصفحات الاستعلام ولكن مثل ما ذكرت انت الفكرة أصبحت اصعب قليلا كنت اريد اعمل left join من الجدولين حيث انني لدي الجدول الأول المشار له في المشاركة أعلاه + جدول المفضلة ولكني تراجعت بعد تعقيد الفكرة وقمت بوضع استعلام لجدول المفضلة بشكل منفصل حتى لا يكون استعمله في مواقع مختلفة في التطبيق معقد

 

كل الشكر لك اخي الكريم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...