-
المساهمات
1588 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
1
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Khaled Osama3
-
الطريقة الأفضل لتجنب استدعاء الهوك داخل حلقة هي استخدام خطاف useMemo: const users = useMemo(() => { return userIds.map(userId => useFetchUser(userId)) }, [userIds]) return ( <div> {users.map(user => ( <div key={user.id}> {user.id} - {user.name} </div> ))} </div> ) useMemo سيضمن أن يتم استدعاء useFetchUser مرة واحدة لكل مستخدم، بدلاً من داخل حلقة. ويعتمد users على userIds فقط، فعندما يتغير userIds سيتم إعادة إنشاء users. هذه الطريقة تجنب المشاكل التي تحدث عند استدعاء الهوك داخل حلقة، وتضمن أن يتم استدعاء useFetchUser بالترتيب الصحيح.
-
يمكنك استخدام sometimes لحل هذه المشكلة $request->validate([ 'first_name' => 'required_without_all:first_name,middle_name,last_name,email,password,active', 'middle_name' => 'required_without_all:first_name,middle_name,last_name,email,password,active', 'last_name' => 'required_without_all:first_name,middle_name,email,password,active', 'email' => 'required_without_all:email,first_name,middle_name,last_name,password,active', 'password' => [ 'nullable', // يسمح بالقيمة الفارغة أو الـ null 'bail', 'sometimes', // يتم تطبيق القاعدة إذا كانت القيمة موجودة Password::min(8)->letters()->mixedCase()->numbers()->symbols(), ], 'active' => 'required_without_all:first_name,middle_name,last_name,email,password', ]); في هذا الحل، يتم استخدام 'nullable' للسماح بالقيمة الفارغة أو الـ null في حقل كلمة المرور. ثم يتم استخدام 'sometimes' مع 'bail' لتطبيق القاعدة (Password::min(8)->letters()->mixedCase()->numbers()->symbols()) إذا كانت القيمة موجودة (تم تحديث حقل كلمة المرور). يعني ذلك إذا كانت قيمة حقل كلمة المرور موجودة، سيتم تطبيق قواعد التحقق، وإذا كانت فارغة، فلن يتم تطبيقها.
-
وعليكم السلام، تعلم تطوير الواجهة الخلفية (باك إند) للمواقع بسبب قلة الموارد المتوفرة باللغة العربية. إليك بعض النصائح: - ابدأ بتعلم إحدى لغات البرمجة الشائعة للباك إند مثل PHP أو Java أو Python. هناك العديد من الكتب والدورات التدريبية المجانية أو المفتوحة المصدر باللغة الإنجليزية. - امتلك خلفية عن قواعد البيانات مثل MySQL ونظم إدارة قواعد البيانات مثل PHPMyAdmin. - تعلم مهارات تصميم الواجهة الخلفية مثل إنشاء جداول البيانات وتحديثات البيانات وصلاحيات المستخدمين. - تدرب على بناء بروتوكولات شبكة مثل REST API للتواصل بين الواجهة الأمامية والخلفية. - ابحث عن مشاريع مفتوحة المصدر على GitHub وتدرب على تحليلها وتعديلها. - تابع المجتمعات العربية على الإنترنت للمساعدة والإرشاد الفني. أتمنى أن تجد هذه النصائح مفيدة. توكل على الله وابدأ العمل، ستتعلم الكثير خلال التدريب العملي. يمكنك قراءه هذه المقاله:
-
للوصول إلى phpMyAdmin وإدارة قواعد البيانات MySQL الخاصة بك باستخدام PHP، يمكنك استخدام أي لغة برمجة تدعم الاتصال بقواعد البيانات MySQL والتفاعل معها. اللغة الأكثر شيوعاً لتطوير واجهات المستخدم الويب هي PHP نفسها، لكن يمكنك استخدام أي لغة أخرى تدعم الاتصال بقواعد البيانات MySQL. في حال استخدام PHP، يمكنك ربط بين ملفات الموقع والphp 1. إنشاء اتصال بقاعدة البيانات: في ملف PHP، استخدم الأمر `mysqli_connect` لإنشاء اتصال بقاعدة البيانات. يجب عليك توفير اسم المضيف (localhost في حالة phpMyAdmin مثبتة محليا)، اسم المستخدم، كلمة المرور، واسم قاعدة البيانات. <?php $host = "localhost"; $username = "اسم_المستخدم"; $password = "كلمة_المرور"; $database = "اسم_قاعدة_البيانات"; $conn = mysqli_connect($host, $username, $password, $database); if (!$conn) { die("فشل الاتصال: " . mysqli_connect_error()); } ?> 2. استعلامات SQL: يمكنك استخدام اللغة SQL لاستعلام وتحديث البيانات في قاعدة البيانات. قم بتنفيذ استعلامات SQL باستخدام `mysqli_query`. <?php $sql = "SELECT * FROM اسم_الجدول"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { while ($row = mysqli_fetch_assoc($result)) { // استخدم البيانات هنا } } else { echo "لا توجد نتائج"; } mysqli_close($conn); ?> يمكنك أيضاً استخدام استعلامات INSERT، UPDATE، DELETE لتعديل البيانات. 3. تضمين ملفات PHP في صفحات الموقع: يمكنك استخدام `include` أو `require` لتضمين ملفات PHP في صفحات موقعك. على سبيل المثال، <?php include("ملف_الاتصال_بقاعدة_البيانات.php"); ?> هذا يسمح لك باستخدام متغيرات الاتصال بقاعدة البيانات في جميع صفحات موقعك. يرجى ملاحظة أنه يجب عليك تحديد قواعد البيانات الخاصة بك وهياكل الجداول وفقًا لاحتياجات مشروعك.
-
المشكلة هنا أن كلمة "global" لا يمكن استخدامها داخل الفئات في PHP، لأن global تستخدم لجعل متغير متاح عالميا خارج الفئات. الحل هو استدعاء متغيرات الاتصال بقاعدة البيانات من ملف config.php دون استخدام global: 1. استدعاء ملف config.php كما هو موجود الآن لتضمين المتغيرات: include('../config.php'); 2. استخدم المتغيرات مباشرة دون إضافة كلمة global: class Database { private $db_host; private $db_user; private $db_pass; private $db_name; public function __construct() { $this->db_host = $db_server; $this->db_user = $db_user; $this->db_pass = $db_password; $this->db_name = $db_name; } } بهذه الطريقة سيتم الوصول إلى المتغيرات المعرفة في ملف config.php داخل الفئة دون مشكلة.
-
هناك طريقتان أساسيتان لإضافة ميزات جديدة لمشروع لارافل منشور على استضافة: الطريقة الأولى هي عبر نظام إدارة النسخ مثل Git: - فبإمكانك تحديث المشروع محلياً. - ثم إضافة التعديلات والملفات الجديدة وعمل كوميت لها. - ثم Pushها إلى المستودع الرئيسي مثل GitHub. - قم بعمل Pull request من GitHub إلى المشروع على الاستضافة. - مراجعة التعديلات وموافقتها. - سيتم بعدها تحديث المشروع على الاستضافة تلقائيا. الطريقة الثانية هي رفع الملفات يدوياً: - حيث تقوم بتحديث المشروع محلياً. - قم بنسخ جميع الملفات المحدثة بما فيها الجديدة. - تسجيل الدخول إلى حساب الاستضافة عبر FTP أو SSH. - قم بنسخ الملفات المحدثة والجديدة إلى السيرفر. - تحقق من عمل التحديثات على الاستضافة.
-
المشكلة في طريقة إضافة الشرط (WHERE clause) إلى الاستعلام و ليست آمنة. عند استخدام implode() سيتم إضافة الشروط دون علامات الاقتباس مما يجعل الاستعلام غير صالح. الحل هو استخدام طريقة أخرى لإضافة الشرط مثل: $where = '1=1'; // دائما TRUE if(is_array($where_conditions)) { $where_parts = []; foreach($where_conditions as $field => $value) { $where_parts[] = "{$field} = '{$value}'"; } $where .= ' AND ' . implode(' AND ', $where_parts); } $queryStr = "SELECT * FROM {$table} WHERE {$where}"; هذا التعديل يضيف تكوينًا صحيحًا للشرط في حالة وجود مصفوفة لتصفية المهام.
-
المشكلة هي أن دالة toggle تقوم بتغيير حالة isOpen العامة، وهذا يؤدي إلى فتح أو إغلاق كل الصفوف مرة واحدة عند النقر على أي زر "تبديل العرض". يجب تعديل الكود لاستخدام متغير expandedRowIndex الذي يشير إلى صف محدد يتم فتحه. بذلك، يمكنك فقط فتح صف واحد في كل مرة، وذلك باستخدام الحالة المحلية هنا كيف يمكن عرض مكون AutoShopPriceExpand فقط للصف ذي الصلة: 1. نحتاج إضافة متغير محلي isExpanded يخزن ID الصف المفتوح: const [expandedRowIndex, setExpandedRowIndex] = useState(null); 2. نضيف ID لكل صف: {filteredAutoShopPricesLists.map((autoshop, index) => { return ( <Tr key={autoshop.id}> ... </Tr> ) })} 3. للنقرة على الصف يقوم بتحديد ID: const toggleExpand = (id) => { setExpandedRowIndex(expandedRowIndex === id ? null : id); } 4. ونعرض المكون بناء على ID: <Tr onClick={() => toggleExpand(autoshop.id)}> ... </Tr> {expandedRowIndex === autoshop.id && ( <AutoShopPriceExpand details={autoshop}/> )} بهذا سيتم عرض مكون واحد فقط للصف المنقور عليه.
-
يمكنك استخدام مكتبة Laravel Excel. تعتبر هذه المكتبة مفيدة لمعالجة ملفات Excel بشكل سهل وفعال. https://docs.laravel-excel.com/3.1/getting-started/ يمكنك تثبيت المكتبة باستخدام Composer: composer require maatwebsite/excel بعد تثبيت المكتبة، يمكنك إعداد ملف التكوين `config/excel.php` عبر الأمر: php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config ثم يمكنك استخدام الكود التالي في وحدة التحكم (`App\Http\Controllers\UserController`) لتحميل ملف Excel وإدراج بياناته في قاعدة البيانات: use Maatwebsite\Excel\Facades\Excel; use App\Imports\UsersImport; public function importUsers() { // استخدام مكتبة Laravel Excel لتحميل ملف Excel Excel::import(new UsersImport, 'users.xlsx'); return 'Users imported successfully!'; } ثم، يجب عليك إنشاء فئة `UsersImport` لمعالجة عملية الاستيراد. يمكنك استخدام الأمر التالي لإنشاء الفئة: php artisan make:import UsersImport ومن ثم، يمكنك تحرير الفئة المنشأة `UsersImport` لتناسب حقول الجدول `users`: namespace App\Imports; use App\Models\User; use Maatwebsite\Excel\Concerns\ToModel; class UsersImport implements ToModel { public function model(array $row) { return new User([ 'prefix' => $row['prefix'], 'firstname' => $row['firstname'], 'middlename' => $row['middlename'], 'lastname' => $row['lastname'], 'suffix' => $row['suffix'], 'slug' => $row['slug'], 'tags' => $row['tags'], 'status' => $row['status'], 'password' => $row['password'], 'email' => $row['email'], 'email_verified_at' => $row['email_verified_at'], 'altemail' => $row['altemail'], 'empnumber' => $row['empnumber'], 'altempnumber' => $row['altempnumber'], 'type' => $row['type'], 'description' => $row['description'], 'dob' => $row['dob'], 'doh' => $row['doh'], 'dos' => $row['dos'], 'separation_reason' => $row['separation_reason'], 'home_number' => $row['home_number'], 'home_street' => $row['home_street'], 'home_street_alt' => $row['home_street_alt'], 'home_city' => $row['home_city'], 'home_state' => $row['home_state'], 'home_postalcode' => $row['home_postalcode'], 'home_county' => $row['home_county'], 'home_country' => $row['home_country'], 'home_lat' => $row['home_lat'], 'home_lng' => $row['home_lng'], 'signature' => $row['signature'], 'logins' => $row['logins'], 'last_login_dt' => $row['last_login_dt'], 'last_login_ip' => $row['last_login_ip'], 'dl_state' => $row['dl_state'], 'dl_number' => $row['dl_number'], 'dl_type' => $row['dl_type'], 'facebook' => $row['facebook'], 'twitter' => $row['twitter'], 'religion' => $row['religion'], 'worship_place' => $row['worship_place'], 'armed_service' => $row['armed_service'], 'professional_orgs' => $row['professional_orgs'], 'will_info' => $row['will_info'], 'organ_donor' => $row['organ_donor'], 'bookmarks' => $row['bookmarks'], 'locked' => $row['locked'], 'personnel' => $row['personnel'], ]); } } يمكنك استخدام دالة `ToModel` لتعيين البيانات المستخرجة إلى نموذج `User`. بعد تكوين ذلك، يمكنك استدعاء دالة `importUsers` عبر الطريقة المناسبة في تطبيق Laravel الخاص بك، مثل إنشاء مسار واستدعاء الوحدة التحكم.
-
1. Pass by Reference: يتم إرسال عنوان المتغير (عنوان الذاكرة) وليس قيمته. فأي تغيير في المتغير داخل الدالة سيؤثر على القيمة الأصلية خارجها أيضًا. شرح بسيط لمفهوم عنوان الذاكرة عند استدعاء دالة أو طريقة وتمرير متغير إليها بالمرجع، فإن ما يتم إرساله ليس القيمة نفسها بل عنوان الذاكرة التي تحتوي على هذه القيمة. فمثلاً لو أرسلنا متغير obj إلى دالة، فإن ما سيتم إرساله هو عنوان ذاكرة الـ obj في الرام وليس القيمة نفسها. عندها إذا حدث تغيير في المتغير داخل الدالة مثلاً بتحديث قيمة خاصية ما، فسيتم التغيير في نفس عنوان الذاكرة الذي تعلق المتغير الأصلي به. بذلك سينعكس التغيير على القيمة خارج الدالة أيضاً لأن كلاهما يشيران لنفس عنوان الذاكرة. function modifyNumber(obj) { obj.value = obj.value * 2; } let myNumber = { value: 5 }; modifyNumber(myNumber); console.log(myNumber.value); // سيطبع: 10 2. Pass by Value: هو أن المتغير المرسل في دالة أو طريقة يتم نسخ قيمته وليس المرجع أو العنوان. أي أن أي تغيير في قيمة المتغير داخل الدالة لن يؤثر على القيمة الأصلية خارجها. function modifyNumber(num) { num = num * 2; } let myNumber = 5; modifyNumber(myNumber); console.log(myNumber); // سيطبع: 5 3. Shallow Copy: Shallow Copy تعني إنشاء نسخة جديدة من الهيكل الرئيسي للكائن، لكن لا يتم إنشاء نسخ فرعية للكائنات الموجودة داخله. let originalArray = [1, 2, [3, 4]]; // Shallow Copy let shallowCopy = [...originalArray]; shallowCopy[2][0] = 99; console.log(originalArray); // سيطبع: [1, 2, [99, 4]] 4. Deep Copy: Deep Copy تعني إنشاء نسخة جديدة من الهيكل الرئيسي وجميع الكائنات الفرعية داخله. let originalArray = [1, 2, [3, 4]]; // Deep Copy let deepCopy = JSON.parse(JSON.stringify(originalArray)); deepCopy[2][0] = 99; console.log(originalArray); // سيطبع: [1, 2, [3, 4]] 5. Type Coercion: هو تحويل تلقائي للأنواع في جافاسكريبت عند القيام بعمليات رياضية أو مقارنة بين قيم مختلفة. let result = 5 + "5"; console.log(result); // سيطبع: "55" فائدة استخدام كل من هذه المفاهيم تعتمد على الحالة البرمجية. مثلا، نستخدم "Pass by Reference" عندما نريد تعديل القيمة الأصلية داخل الدالة. نستخدم "Pass by Value" عندما نريد تجنب تأثير الدالة على القيمة الأصلية. "Shallow Copy" تستخدم عندما نحتاج إلى نسخة سريعة وغير مكلفة من البيانات. "Deep Copy" تستخدم عندما نحتاج إلى نسخة كاملة ومستقلة من البيانات، بدون مشاركة بين النسخ. "Type Coercion" تحدث تلقائياً في العديد من الحالات، ولكن يمكننا استخدامها عندما نحتاج إلى تحويل صريح للأنواع لضمان التناسب الصحيح.
-
تفضل اخي هذا هو الكود بعد التحديث واستخدام PDO update.php
-
تم وضع علامات استفهام في جملة الادخال بسبب استخدام prepared statements في PHP. Prepared statements تسمح لنا بالاعداد مسبقا لعملية الادخال ولكن بدون تحديد القيم بعد. فالعلامات الاستفهام تعني ان هذه القيم سوف تعطى لاحقا قبل تنفيذ العملية. اما بالنسبة ل$stmt فهو ليس مجرد اسم متغير بل هو object من نوع Statement يمثل العملية المعدة مسبقا. عندما نستخدم prepared statements فانه يتم انشاء عضو Statement وتخزين التعليمة المعدة فيه قبل تحديد القيم. ثم نستخدم ميثودات على هذا العضو لتعيين القيم وتنفيذ العملية مثل bind_param و execute. بشكل مختصر: - العلامات استفهام لان القيم لم تحدد بعد في التعليمة المعدة - $stmt هو عضو Statement يمثل التعليمة المعدة قبل تحديد القيم السبب في ظهور العناصر ال HTML بعد تعديلها رغم استخدام دوال التنقية مثل mysqli_real_escape_string هو: - دوال التنقية مثل mysqli_real_escape_string تقوم بتنقية البيانات فقط من أخطار الاقتحام عبر SQL Injection. - لكنها لا تقوم بتنقية البيانات من الشوائب أو الرموز ال HTML. - فعندما نعدل بيانات تحتوي على عناصر HTML مثل <b>، <script> إلخ فسيظل هذا المحتوى HTML موجوداً. - مثل ما اخبرتك سابقا - لذا يجب إما تنقية البيانات يدوياً من الرموز الخطرة أو استخدام الدوال الخاصة بتنقية المحتوى HTML مثل strip_tags() أو htmlspecialchars(). - فهذه الدوال تقوم بترميز أو إزالة الرموز ال HTML لإبقاء البيانات آمنة عند عرضها. لذا الحل هنا هو إما تنقية يدوية للبيانات أو استخدام دوال تنقية HTML أيضاً مع mysqli_real_escape_string.
-
يبدو أن هناك خطأ في كود SQL الذي قمت بتقديمه. الخطأ يتعلق بوجود خطأ في تسمية العمود "coustomerID" بدلاً من "customerID". إليك الكود المصحح: INSERT INTO installments (amount, coustomerID, date) VALUES (500, 2222, "11-oct-2023"), (800, 1111, "15-oct-2023"), (750, 3333, "30-oct-2023"); قمت بتصحيح التسمية إلى "coustomerID" . الآن يجب أن يكون الكود صحيحًا.
-
لقراءة سلسلة رمزية واستبدال أي حرف فيها بحرف آخر. وهذا هو الكود كامل: #include <iostream> #include <string> using namespace std; int main() { // قراءة السلسلة الرمزية cout << "أدخل سلسلة رمزية: "; string inputString; getline(cin, inputString); // استبدال الحرف char targetChar, replacementChar; cout << "أدخل الحرف الذي تريد استبداله: "; cin >> targetChar; cout << "أدخل الحرف البديل: "; cin >> replacementChar; // قم بتنفيذ استبدال الحرف for (char &c : inputString) { if (c == targetChar) { c = replacementChar; } } // طباعة السلسلة بعد الاستبدال cout << "السلسلة بعد الاستبدال: " << inputString << endl; return 0; } هذا البرنامج يقوم بقراءة سلسلة رمزية من المستخدم، ثم يطلب من المستخدم إدخال حرف يريد استبداله وحرف بديل. بعد ذلك، يتم تنفيذ عملية الاستبدال في السلسلة وطباعتها. يمكنك تغيير البرنامج حسب احتياجاتك الخاصة. إليك عينة بسيطة للمدخلات والإخراج: أدخل سلسلة رمزية: Hello, World! أدخل الحرف الذي تريد استبداله: o أدخل الحرف البديل: x السلسلة بعد الاستبدال: Hellx, Wxrld! في هذا المثال، تم إدخال سلسلة رمزية "Hello, World!"، وتم استبدال كل حرف "o" بالحرف "x". الناتج هو "Hellx, Wxrld!".
-
أخي الكريم، سأحاول شرح الفرق بين الـ foreach والـ map في PHP و React بأسلوب بسيط: - في PHP الـ foreach مصمم بشكل خاص لتكرار عناصر المصفوفة والوصول إلى قيمتها وفهرسها داخل الحلقة. - أما الـ array_map فهو يقوم بتطبيق دالة معينة على كل عنصر بدلاً من مجرد الوصول إليه. - في React، لا يوجد ما يعادل الـ foreach. ولكن الـ map يقوم بنفس وظيفة الـ foreach إضافة إلى إمكانية تطبيق دالة على العناصر كما في array_map. - فهو يقوم بتكرار عناصر المصفوفة وإرجاع مصفوفة جديدة مع إمكانية تغيير قيمة العناصر أو إضافة بيانات جديدة. في PHP، الـ `foreach` تُستخدم عادة لتكرار العناصر في مصفوفة. يتيح لك ذلك الوصول إلى كل عنصر على حدة بسهولة والقيام بالعمليات المطلوبة. $array = [1, 2, 3, 4, 5]; foreach ($array as $value) { echo $value . '<br>'; } في React (وJavaScript بشكل عام)، `map` تستخدم عادة لتحويل مصفوفة من العناصر إلى عناصر جديدة. يمكن استخدامها لإنشاء قائمة من العناصر jsx const numbers = [1, 2, 3, 4, 5]; const doubledNumbers = numbers.map((number) => number * 2); // في JSX const listItems = doubledNumbers.map((number) => <li key={number}>{number}</li>); الاختلاف في الاستخدام يعود إلى الطريقة التي يتم فيها التعامل مع البيانات في كل لغة. في PHP، تكون العمليات عادةً مباشرة على البيانات، بينما في JavaScript وReact، يُفضل استخدام `map` للتلاعب بالبيانات وإنشاء هيكل JSX بشكل أنيق.
-
بالطبع اخي ايمن حتي تعمل حمايه للبيانات يمكنك اتخاذ بعض الاجراءات 1. تجنب استخدام الإدخالات المباشرة: تجنب استخدام البيانات المدخلة مباشرة في استعلام SQL بدون فحص أو تنقية. يمكن استخدام `mysqli_real_escape_string` لتنقية البيانات. ومع ذلك، يُفضل استخدام Prepared Statements (البنيات الجاهزة) بدلاً من ذلك. $fname = mysqli_real_escape_string($conn, $_POST['fname']); $course_name = mysqli_real_escape_string($conn, $_POST['course_name']); $course_code = mysqli_real_escape_string($conn, $_POST['course_code']); $mid_exam = mysqli_real_escape_string($conn, $_POST['mid_exam']); $fir_exam = mysqli_real_escape_string($conn, $_POST['fir_exam']); $final = mysqli_real_escape_string($conn, $_POST['final']); $id_code = mysqli_real_escape_string($conn, $_POST['id_code']); 2. التحقق من البيانات: يمكنك فحص نوع البيانات المدخلة للتأكد من تناسبها مع نوع البيانات المتوقع. على سبيل المثال: if (!is_numeric($mid_exam) || !is_numeric($fir_exam) || !is_numeric($final)) { // رسالة خطأ } 3. التحقق من البيانات قبل الإدخال: قم بإجراء فحص على البيانات قبل تنفيذ الاستعلام SQL. يمكنك استخدام الشروط للتحقق من صحة البيانات. if (empty($fname) || empty($course_name) || empty($course_code) || empty($mid_exam) || empty($fir_exam) || empty($final) || empty($id_code)) { // رسالة خطأ } 4. استخدام Prepared Statements: يُفضل استخدام Prepared Statements لتجنب هجمات حقن SQL. في PHP، يمكنك استخدام `mysqli` بالتالي: $stmt = $conn->prepare("INSERT INTO student (fname, course_name, course_code, mid_exam, fir_exam, final, id_code) VALUES (?, ?, ?, ?, ?, ?, ?)"); $stmt->bind_param("sssssss", $fname, $course_name, $course_code, $mid_exam, $fir_exam, $final, $id_code); if ($stmt->execute()) { // تم الإدخال بنجاح } else { // خطأ في الإدخال } $stmt->close(); باستخدام Prepared Statements، سيتم التعامل بشكل صحيح مع البيانات وتجنب تأثير هجمات حقن SQL. وهذا هو الكود كامل بعد التحسين <?php include 'database.php'; include 'navbar.php'; if (isset($_POST['submit'])) { // تنقية البيانات باستخدام mysqli_real_escape_string $fname = mysqli_real_escape_string($conn, $_POST['fname']); $course_name = mysqli_real_escape_string($conn, $_POST['course_name']); $course_code = mysqli_real_escape_string($conn, $_POST['course_code']); $mid_exam = mysqli_real_escape_string($conn, $_POST['mid_exam']); $fir_exam = mysqli_real_escape_string($conn, $_POST['fir_exam']); $final = mysqli_real_escape_string($conn, $_POST['final']); $id_code = mysqli_real_escape_string($conn, $_POST['id_code']); // التحقق من صحة البيانات if (empty($fname) || empty($course_name) || empty($course_code) || !is_numeric($mid_exam) || !is_numeric($fir_exam) || !is_numeric($final) || empty($id_code)) { echo '<div class="alert alert-danger text-center w-25" role="alert"> الرجاء إدخال بيانات صحيحة </div>'; header("refresh:2;url=index.php"); exit(); } // استخدام Prepared Statements لتجنب حقن SQL $stmt = $conn->prepare("INSERT INTO student (fname, course_name, course_code, mid_exam, fir_exam, final, id_code) VALUES (?, ?, ?, ?, ?, ?, ?)"); $stmt->bind_param("sssssss", $fname, $course_name, $course_code, $mid_exam, $fir_exam, $final, $id_code); if ($stmt->execute()) { echo '<div class="alert alert-success text-center w-25" role="alert"> تم حفظ البيانات بنجاح </div>'; header("refresh:2;url=display.php"); } else { echo '<div class="alert alert-danger text-center w-25" role="alert"> حدث خطأ أثناء حفظ البيانات </div>'; echo mysqli_error($conn); } $stmt->close(); } ?>
-
- الـ Closures هي دوال تمتلك إمكانية الوصول إلى السكوب الخارجي، أي المتغيرات والإعدادات التي كانت موجودة عند تعريفها. مثال: function outer() { let name = "John"; function inner() { console.log(name); } return inner; } let myFunction = outer(); myFunction(); // يطبع "John" - أما Prototypal Inheritance فهي التي تتبعها جافاسكريبت للوراثة. حيث أن الكائنات ترث من بعضها عبر الـ prototype chain. مثال: let person = { name: "John" }; let student = Object.create(person); student.level = "First year"; console.log(student.name); // يطبع "John" ولأن جافاسكريبت ليس لغة موجهة للكائنات، فهي لا تستخدم فكرة الكلاسات، بل تعتمد على هذه الطريقة. في جافاسكريبت، لا يوجد نظام كلاسي بالمعنى الذي يوجد في بعض اللغات الأخرى. بدلاً من ذلك، يتم الاعتماد على نظام Prototypal Inheritance الذي يسمح بتبادل السمات بين الكائنات بشكل فعّال. هذا يجعل البرمجة أكثر مرونة وإمكانية إعادة الاستخدام. يمكنك استخدام Prototypal Inheritance لبناء هياكل بيانات مرنة وتنظيم الكود بشكل أفضل، مما يسهل صيانة البرامج على المدى الطويل.
-
تظهر حالة الـ 302 عادةً عندما يتم تحويل المستخدم من صفحة إلى أخرى. في حالة فشل تسجيل الدخول، يبدو أن Laravel يقوم بتحويل المستخدم إلى الصفحة الخاصة بتسجيل الدخول مرة أخرى، وذلك على الأرجح بسبب خطأ في البيانات المدخلة. لكن هناك بعض التحسينات التي يمكن إجراؤها لتجنب ظهور حالة 302 عند فشل تسجيل الدخول. 1. استخدام `attempt` لفحص بيانات تسجيل الدخول: بدلاً من استخدام `validate` يمكنك استخدام `attempt` لتبسيط الأمور وتجنب الرجوع إلى الـ view يدوياً عند فشل عملية التسجيل. قم بتغيير هذا الكود: if (!Auth::validate($credentials)) { $error = 'Neplatné údaje!'; return view('admin.login-form', compact('error')); } إلى: if (!Auth::attempt($credentials)) { $error = 'Neplatné údaje!'; return view('admin.login-form', compact('error')); } بعد تطبيق هذه التحسينات، يمكنك إعادة تشغيل التطبيق والتحقق مما إذا كانت المشكلة قد حُلت.
-
يبدو أن هناك بعض الأخطاء في الكود، ولكن دعني أوضح لك كيفية حفظ الصورة في مجلد عام. يبدو أنك تستخدم Laravel، وهذا ممتاز. لكن، يجب عليك تصحيح الأخطاء التي تظهر في الكود الحالي. الخطأ الرئيسي يتعلق بالتعامل مع الملفات وتحديد المسار الصحيح. في الكود الخاص بك، قد تكون هناك مشكلة في التعامل مع متغير `$pages`، لأنه غير معرف في السياق الحالي. تصحيح الكود: public function store(Request $request) { $input = $request->validate([ 'pages_category_id' => 'required', 'name' => 'required', 'content' => 'required', 'thumbnail' => 'required|image', ]); // تحقق من وجود ملف الصورة في الطلب if ($image = $request->file('thumbnail')) { // حدد المسار الذي تريد حفظ الصورة فيه $destinationPath = 'uploads/pages/'; // قم بتوليد اسم فريد للصورة // الافضل استخدام date('YmdHis') لضمان ان الاسم فريد $imageName = date('Ymd') . "." . $image->getClientOriginalExtension(); // انقل الصورة إلى المسار المحدد $image->move(public_path($destinationPath), $imageName); // قم بتحديث قيمة الحقل 'thumbnail' في المتغير $input $input['thumbnail'] = $destinationPath . $imageName; } // لاحظ أننا قمنا بإعادة تعيين $input هنا بدلاً من أخطاء السطرين السابقين $input['content'] = strip_tags($request->content); // استخدام $input بدلاً من $request->all() Pages::create($input); return redirect('pages/list')->with('success', 'Success Add Page'); } تأكد من أن مجلد "uploads/pages/" قابل للكتابة من قبل الخادم، وأن جميع الأذونات اللازمة متاحة. كما أننا قمنا بتحديث اسم الحقل إلى 'thumbnail'. تأكد من أن اسم الحقل يتناسب مع الحقل الذي تريد حفظ الصورة فيه في جدول قاعدة البيانات.
-
عند نشر مشروع Laravel على استضافة، يتعين عليك تنفيذ بعض الخطوات لضمان عمل التطبيق بشكل صحيح.فيما يلي أشهر خدمات الاستضافة: 1. استضافة مشروع Laravel على استضافة مشتركة: في حالة استخدامك لاستضافة مشتركة، يفضل أن تتصل بخدمة الدعم الفني للحصول على دعم بخصوص تنفيذ الأوامر. في كثير من الأحيان، يكون لديك واجهة تحكم (cPanel أو Plesk) حيث يمكنك استخدام أدوات إدارة قواعد البيانات لتنفيذ الأوامر. 2. استضافة على خوادم افتراضية أو خوادم خاصة: إذا كنت تستخدم خوادم افتراضية أو خوادم خاصة، يمكنك الاتصال بالخادم عبر SSH وتنفيذ الأوامر مباشرة. استخدم Terminal للوصول إلى خادمك وتنفيذ الأوامر المطلوبة. 3. استخدام استضافة سحابية مثل AWS أو DigitalOcean: في حالة استخدام خدمات السحابة، يمكنك الوصول إلى خادمك عبر SSH. بعد الاتصال بالخادم، قم بالتنقل إلى مجلد المشروع وتنفيذ الأوامر من خلال Terminal. 4. استخدام أدوات إدارة المشاريع مثل Laravel Forge: يمكنك استخدام أدوات إدارة المشاريع مثل Laravel Forge التي تقدم واجهة بسيطة لإدارة مشاريع Laravel على الخوادم. يمكنك تنفيذ الأوامر من خلال واجهة المستخدم أو استخدام خيارات تكوين خاصة. تتباين الخطوات بناءً على نوع الاستضافة التي تستخدمها. الاتصال بدعم الاستضافة أو استخدام SSH يمكن أن يكون الحلا الأمثل. استخدم الوثائق الرسمية لخدمة الاستضافة الخاصة بك للحصول على تفاصيل أكثر دقة.
-
في ملف gallery.html يجب تغيير data-pos بدلاً من data.pos حيث أن تستدعيها بطريقه خاطئه في ملف ال javascript. في ملف slider.js يبدو أن هناك خطأ في الطريقة التي قمت بها بتحديد الدالة واستخدامها. var translateValue = "translateX(" + position * 25 + "%)"; وهذا هو الكود كامل بعد التعديل والتحسين var $links = $(".itemLinks"); $links.click(function (e) { $links.removeClass("active"); var clickedLink = $(e.target); var position = clickedLink.attr("data-pos"); var translateValue = "translatex(" + position * 25 + "%)"; $("#wrapper").css({ transform: translateValue }); clickedLink.addClass("active"); }); $links.eq(0).addClass("active"); استخدم .eq(0) بدلاً من indexing [] للحصول على العنصر الأول
-
هناك بعض الاختلافات بين Laragon و XAMPP: - Laragon مخصص أكثر لمشاريع لارافال، بينما XAMPP أكثر شمولاً لمشاريع PHP عامة. - Laragon أسهل في الاستخدام وتثبيت الأدوات والمكونات الإضافية. - XAMPP أكثر شعبية ومتاحة لمنصات أخرى غير ويندوز، بينما Laragon مقتصر على ويندوز فقط. - Laragon يوفر بيئة تطوير متكاملة أكثر من XAMPP وتشمل أدوات متقدمة لتطوير الويب. أما بخصوص أمر php artisan serve فهو: يستخدم هذا الأمر لتشغيل خادم تطوير مدمج مع Laravel. يوفر روابط لطيفة مثل http://localhost:8000. يتيح لك العمل بسرعة على تطبيقك دون الحاجة إلى تكوين Apache أو Nginx. Apache: Apache هو خادم الويب الشهير ويستخدم على نطاق واسع. عند استخدام Apache، يمكنك تكوين مشروع Laravel للعمل معه. يستخدم عادة في بيئات الإنتاج. الفوائد من استخدام php artisan serve: سرعة التطوير: يمكنك البدء بسرعة في التطوير باستخدام php artisan serve دون الحاجة إلى تكوين خوادم خارجية. نصف التلقائي: يقوم Laravel بإعادة تحميل التغييرات تلقائيًا عند استخدام php artisan serve، مما يسهل عملية تطوير التطبيق. روابط لطيفة: يوفر php artisan serve روابط بسيطة ولطيفة تمكنك من الوصول إلى تطبيقك. يمكن استخدام كل من php artisan serve و Apache حسب الحاجة، اعتمادًا على سيناريوهات التطوير أو الاختبار.
-
المشكلة التي تواجهها تحدث عندما تقوم بإدراج قيمة متغير داخل `input` في النموذج، حيث يجب أن تقوم بتضمين قيمة المتغير داخل علامات الاقتباس (`"`). في هذا السياق، يمكنك تعديل محتوى الـ `input` في النموذج ليكون كالتالي: <input type="text" class="form-control" name="fname" required value="<?php echo $fname ?>"> قمت بإضافة علامات الاقتباس حول `<?php echo $fname ?>`، وهذا يساعد في ضمان أنه عند طباعة القيمة في الـ `input`، يتم استخدام القيمة بكاملها، بما في ذلك الفراغات إذا كان هناك أي. بالنسبة لحماية مدخلاتك من حقن SQL، يفضل دائمًا استخدام استعلامات معلمة محددة (`prepared statements`) بدلاً من تضمين القيم مباشرة في الاستعلام. يمكنك استخدام ميزات mysqli المدمجة لتحقيق ذلك. لحماية طباعة HTML داخل `input`، يمكنك استخدام `htmlspecialchars` لتحويل الرموز الخاصة بـ HTML إلى ترميزها المقابل. على سبيل المثال: <input type="text" class="form-control" name="fname" required value="<?php echo htmlspecialchars($fname, ENT_QUOTES, 'UTF-8') ?>"> هذا يضمن أن أي رموز HTML غير آمنة يتم تحويلها بشكل صحيح لتجنب حقن HTML.
-
وعليكم السلام ورحمة الله وبركاته، يمكنك تجربه الكود التالي: import os FolderName = "اسم_المجلد" FileName = "اسم_الملف.txt" # إنشاء المجلد إذا لم يكن موجوداً بالفعل os.makedirs(FolderName, exist_ok=True) # فتح الملف في وضع الكتابة ("w") داخل المجلد with open(os.path.join(FolderName, FileName), "w") as file: # يمكنك إضافة المحتوى إذا كنت ترغب في ذلك file.write("Hello, World!") print(f"تم إنشاء الملف {FileName} في المجلد {FolderName}.") استخدام الدالة os.path.join لبناء مسار الملف مع المجلد, هذا الكود يستخدم `os.makedirs` لإنشاء المجلد، وباستخدام `open` يتم إنشاء الملف داخله.
-
السلام عليكم، لإنشاء حلقة تكرار على الكود الحالي، يمكننا استخدام حلقة `for` لتكرار العملية بناءً على عدد المرات التي نرغب في تكرارها. في هذا السياق، يبدو أن عدد المرات التي نرغب في تكرار القيمة هو عدد صفوف الإطار (DataFrame). مثال # استيراد مكتبة pandas import pandas as pd # قراءة البيانات من ملف إكسل df = pd.read_excel('اسم_الملف.xlsx') # إنشاء قائمة لتخزين القيم المكررة repeated_values = [] # حلقة تكرار على صفوف الإطار for i in range(len(df)): # اختيار القيمة من الخلية المطلوبة (في هذا المثال، خلية في الصف الحالي) selected_value = df.iloc[i, 8] # يجب تعديل الرقم 8 حسب الموقع الصحيح للخلية # إضافة القيمة المحددة إلى القائمة مرة أخرى (تكرارها) repeated_values.append(selected_value) # إنشاء عمود جديد في الإطار يحتوي على القيم المكررة df['new_column'] = repeated_values # طباعة الإطار للتحقق print(df)