-
المساهمات
4657 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
30
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو بلال زيادة
-
هناك ايضا طرق أخرى منها, تغيير Migration Length إلى 191 مثل $table->string('name', 191); أو من ملف AppServiceProvider.php في دالة Boot يمكنك إضافة التالية \Illuminate\Support\Facades\Schema::defaultStringLength(191); فتصبح public function boot() { \Illuminate\Support\Facades\Schema::defaultStringLength(191); } إذا كنت لا تهتم بـ utf8mb4 , يمكنك الانتقال إلى ملف config / database.php واستبدال charset و collation بـ utf8 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', تصبح 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
-
تشير رسالة الخطأ إلى أنه تمت تجربة اتصال MySQL عبر Socket (وهو أمر غير مدعوم). يمكنك استخدام بيئة مختلفة و تنفيذ الأمر التالي php artisan migrate --env=production يمكنك في Laravel 5 من تغيير قيمة DB_HOST في ملف .env من localhost إلى 127.0.0.1
- 2 اجابة
-
- 1
-
-
تمام بخصوص لو أردت تغيير إصدار PHP يجب معرفة برنامج السيرفر الشخصي الذي تستخدمه و من ثم الذهاب إلى موقعه الرسمي و تحميل نسخة من هذا البرنامج بعد حذف البرنامج الذي لديك و تحميل نسخة تحتوي على إصدار إقل من PHP 8. فمثلاً إذا كنت تستخدم برنامج xampp يمكنك تحميل نسخة أقل من النسخة التي تستخدمها وتحتوي على إصدار PHP أقل من PHP 8. إذا أردت تحديث نسخة Laravel يجب الذهاب إلى الموقع الرسمي للارافل من هنا. تذهب إلى Upgrade Guide في الموقع بعد أختيار النسخة التي تريد تحديث النسخة التي معك إليها, ومن ثم تقوم بقراءة متطلبات التحديث إلى النسخة التي تريدها.
-
ما هو إصدار Laravel الذي تستخدمه؟ يجب تحديث نسخة Laravel إلى اخر إصدار أو تغيير إصدار PHP لديك ليناسب إصدار Laravel لديك. إذا كنت تستخدم برنامج xampp يمكنك تحميل نسخة أقل من النسخة التي تستخدمها وتحتوي على إصدار PHP أقل من PHP 8.
-
قم بحذف مجلد vendor ثم ملف composer.lock ,ثم قم بتنفيذ الأمر التالي composer dump-autoload ومن ثم الأمر التالي composer install ثم الأمر التالي composer update --no-scripts
-
يمكنك ذلك من خلال وضع الأكواد التالية في ملف .env DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=database2 DB_USERNAME_SECOND=root DB_PASSWORD_SECOND= فلاحظ جيدا اننا قمنا بتعريف متغيرات لقاعدة بيانات أخرى, ثم في مسار config/database.php نقوم بوضع 'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'host' => env('DB_HOST_SECOND'), 'port' => env('DB_PORT_SECOND'), 'database' => env('DB_DATABASE_SECOND'), 'username' => env('DB_USERNAME_SECOND'), 'password' => env('DB_PASSWORD_SECOND'), ], تحت mysql بحيث يكون هذا يكون معلومات الاتصال بقاعدة البيانات الأخرى. يمكنك صنع جدول لقاعدة البيانات عبر Schema بحيث نعرف Schema::connection لقاعدة البيانات الأخرى مثل Schema::connection('mysql2')->create('users_two', function($table) { $table->increments('id'): }); يمكنك استخدام Query Builder بهذا الشكل $posts = DB::connection('mysql2')->select(); ايضا يمكنك توجيه Model إلى استخدام قاعدة الاتصال الثاني الخاص بقاعدة البيانات الثانية باستخدام protected $connection = 'mysql2'; ايضا يمكنك في Controller استخدام الشكل التالي : public function index() { $post = new Post; $post->setConnection('mysql2'); $something = $post->find(1); $get_posts = Post::on('mysql2')->find(1); return $get_posts; }
- 2 اجابة
-
- 1
-
-
هنا يجب استخدام inner join كي تستطيع جلب أخر رسالة لكل عضو فمثلا: SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name; طبعا inner join مقصود بها الربط الداخلي تستخدم لربط جدولين أو اكثر وذلك لتحديد بعض السجلات من الجداول المترابطة مع بعضها, ويمكن استخدامها بعدة صيغ حسب ما تريد الاستعلام عنه, ففي حالتك فلنفترض ان جدول الأعضاء اسمه users وجدول الرسائل اسمه messages فتكون إلية الربط بينهم باستخدام inner join هكذا. SELECT m.msg, u.name FROM messages m INNER JOIN users u ON m.recipient_id = u.id فلاحظ أننا استخدمنا اسماء مستعارة للجداول فجدول users قمنا بإعطائه الاسم المستعار u و جدول messages قمنا بإعطائه الاسم المستعار m و قمنا في الاستعلام السابق بجلب نص الرسالة مع اسم العضو الذي قام بارسالها وقمنا بالتعويض عن اسم الجدول باسمه المستعار.
- 16 اجابة
-
- 1
-
-
في هذا الكود ابسط طريقة وهي إذا لا تريد أحداث تغييرات في الكود يمكنك إضافة limit. <?php $stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); ?> يصبح <?php $stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc limit 1'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); ?> في الكود الثاني ممكن تغيير الشرط بحيث يصبح OR و ليس And . ولكن يتم التحديد ومساعدتك بشكل أفضل إذا أرفقت مجلد المشروع كاملا. هنا يتم استخدام ajax لجلب البيانات بدون تحديث الصفحة. بحيث تقوم بكتابة كود PHP يرجع قيمة عدد الاشعارات بصيغة json و من ثم استخدام ajax لجلب القيمة بدون تحديث للصفحة.
- 16 اجابة
-
- 1
-
-
يمكن إرفاق الكود الخاص بك لمساعدتك في وضع الروابط, أو يمكنك بعد وسم <a class="navbar-brand" href="#">Navbar</a> وضع بعده الرابطين حسب ما تريد مثل <a class="navbar-brand" href="#">اطلب عرض سعر</a> <a class="navbar-brand" href="#">اطلب تطبيق فكرة</a> و من ثم في باستخدام css يمكنك التحكم في محاذاة و مكان الروابط. جميع ما بداخل كلاس collapse navbar-collapse يتم إخفاءه و يتم إظهاره في قائمة المنسدلة على شاشات الجوال عند الضغط على ايقونة البار.
- 2 اجابة
-
- 1
-
-
لديك طريقتان لتشفير كلمة المرور في Laravel. $data['password'] = bcrypt($request->password); و الطريقة الأخرى هي تخزين كلمة المرور غير مشفرة $data['password'] = $request->password; ثم تشفير كلمة المرور في Model public function setPasswordAttribute($value) { $this->attributes['password'] = bcrypt($value); } إذا قمت بذلك بهذه الطريقة ، فتأكد فقط من عدم تجزئة كلمة المرور مرتين ، لذلك يجب عليك الانتقال إلى RegisterController وبدلاً من: 'password' => Hash::make($data['password']); تضيف 'password' => $data['password'] لاحظ أيضًا أنه لا يوجد فرق بين فئة Hash والوظيفة المساعدة bcrypt (). إذا كنت تريد استخدام Hash Hash::make() وتحقق من ذلك عن طريق Hash::check()
- 3 اجابة
-
- 1
-
-
يمكنك استخدام مكتبة html2canvas.js ويمكنك استخدام الأكواد التالية بحيث ملف index.php يكون بداخله التالي <html> <head> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script> <script> function screenshot() { html2canvas(document.body, { onrendered: function(canvas) { var img = canvas.toDataURL() $.post("screenshot.php", {data: img}, function (file){ window.location.href = "screenshot.php?file="+ encodeURI(file) }); } }); } </script> <body> <div id="wrapper"> <div id="screenshot_div"> <button type="button" onclick="screenshot()">أخذ لقطة</button> </div> </div> </body> </html> وملف screenshot.php يكون بداخله الكود التالي <?php if(isset($_GET['file'])) { $file=$_GET['file']; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: image/png'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); unlink($file); exit; } } if(isset($_POST['data'])) { $data = $_POST['data']; $file = md5(uniqid()) . '.png'; $uri = substr($data,strpos($data,",")+1); file_put_contents('./'.$file, base64_decode($uri)); echo $file; exit(); } ?> ويمكنك التجربة على المتصفحة سترى أنه يقوم بإلتقاط الصورة للصفحة.
-
السؤال الأول: بشكل افتراضي , سيقوم Eloquent بتحويل الأعمدة التي تم إنشاؤها و تحديثها و حذفها إلى مثيلات من Carbon. لذلك ، يجب أن تكون شفرتك كما يلي: $comment->created_at->diffForHumans(); السؤال الثاني يمكنك فعل التالي $latestPosts = Genre::with('latestPosts')->orderBy('name')->get(); public function latestPosts() { return $this->hasManyThrough('App\Models\Post', 'App\Models\Band') ->orderBy('id', 'desc') ->take(5) ->get(); } or public function latestPosts() { return $this->posts()->latest()->take(5)->get(); }
- 5 اجابة
-
- 2
-
-
هناك عدة مواقع تقدم هذه الخدمة بدون تعب او تشتت . ايضا يمكن تحدث مشاكل بسبب عدم المهارة في دمج لغة بداخل لغة, يمكنك البحث في قوقل مثلا عن convert html or javascript to php online ستجد الكثير من المواقع تقدم هذه الخدمة. <?php echo '<div class="dropdown">'; echo '<button onClick="myFunction()" class="dropbtn">Dropdown</button>'; echo '<div id="myDropdown" class="dropdown-content">'; echo '<a href="#home">Home</a>'; echo '<a href="#about">About</a>'; echo '<a href="#contact">Contact</a>'; echo '</div>'; echo '</div>'; echo '<script>'; echo 'function myFunction() {'; echo 'document.getElementById("myDropdown").classList.toggle("show");'; echo '}'; echo 'window.onclick = function(event) {'; echo 'if (!event.target.matches('.dropbtn')) {'; echo 'var dropdowns = document.getElementsByClassName("dropdown-content");'; echo 'var i;'; echo 'for (i = 0; i < dropdowns.length; i++) {'; echo 'var openDropdown = dropdowns[i];'; echo 'if (openDropdown.classList.contains('show')) {'; echo 'openDropdown.classList.remove('show');'; echo '}'; echo '}'; echo '}'; echo '}'; echo '</script>'; ?>
- 5 اجابة
-
- 1
-
-
يمكنك استخدام FutureBuilder و التأكد من انه يرجع بيانات أو لا بحيث إذا يرجع بيانات تقوم بإضهارها و إذا لا يرجع تقوم بعرض واجهة فارغ أو نص يخبر المستخدم أنه لا يوجد داتا. كيف يمكن ذلك FutureBuilder تمكنك من استخدام AsyncSnapshot و هذه تحتوي على خاصية hasData للتأكد من رجوع البيانات أو أنه فارغ فمثلا import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); /// This is the main application widget. class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); static const String _title = 'Flutter Code Sample'; @override Widget build(BuildContext context) { return const MaterialApp( title: _title, home: MyStatefulWidget(), ); } } /// This is the stateful widget that the main application instantiates. class MyStatefulWidget extends StatefulWidget { const MyStatefulWidget({Key? key}) : super(key: key); @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends State<MyStatefulWidget> { final Future<String> _calculation = Future<String>.delayed( const Duration(seconds: 2), () => 'Data Loaded', ); @override Widget build(BuildContext context) { return DefaultTextStyle( style: Theme.of(context).textTheme.headline2!, textAlign: TextAlign.center, child: FutureBuilder<String>( future: _calculation, // a previously-obtained Future<String> or null builder: (BuildContext context, AsyncSnapshot<String> snapshot) { List<Widget> children; if (snapshot.hasData) { children = <Widget>[ const Icon( Icons.check_circle_outline, color: Colors.green, size: 60, ), Padding( padding: const EdgeInsets.only(top: 16), child: Text('Result: ${snapshot.data}'), ) ]; } else if (snapshot.hasError) { children = <Widget>[ const Icon( Icons.error_outline, color: Colors.red, size: 60, ), Padding( padding: const EdgeInsets.only(top: 16), child: Text('Error: ${snapshot.error}'), ) ]; } else { children = const <Widget>[ SizedBox( child: CircularProgressIndicator(), width: 60, height: 60, ), Padding( padding: EdgeInsets.only(top: 16), child: Text('Awaiting result...'), ) ]; } return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: children, ), ); }, ), ); } }
- 3 اجابة
-
- 1
-
-
الرجاء إرفاق مجلد مشروعك .
-
يجب عليك استخدام أحدى الحزمتين للمصادقة مثل JWT, PASSPORT و يمكنك إيجاد passport من هنا و jwt من هنا . الفكرة وما فيها هي أن تقوم بأرجاع بيانات التي تريدها بصيغة json لكي يتم قرائتها والتعامل معها. لارافل تقدم أكثر من طريقة لأرجاع البيانات بصيغة json فيمكنك استخدام response()->json(); لارجاع البيانات ستجد شرح كامل لها من هنا أو يمكنك استخدام apiResource وهذا شرح كامل لها من هنا على موقع لارافل. في الموقع التي تريد جلب البيانات إليه من موقع أخر يمكنك استخدام curl لجلب البيانات أو يمكنك استخدام guzzle فمثلا يمكنك الاتصال ب api هكذا $response = Http::get('https://yourwebsite.com/api/v1/questions', [ 'apiKey' => 'توكن المصادقة', ]); وجلب البيانات هكذا $q = json_decode($response->body());
- 2 اجابة
-
- 1
-
-
حتعمل كالتالي حتغير في الاستعلام إلى $mohamad = $conn->query("SELECT c.id as cid, orders.id as oid, admins.id as aid FROM clients c , orders o , admins a WHERE c.id = o.client_id && a.id = o.admin_id"); بحيث تقوم باستخدام اسماء مستعارة لكل جدول وهنا قمنا باستخدام اسم المستعار اول حرف من اسم الجدول لكل الجداول وفي استعلام PHP <?php while ($row = $mohamad->fetch_assoc()) { echo ' <tr> <td class="text-center text-muted">' . $row['cid'] . '</td> <td class="text-center text-muted">' . $row['oid'] . '</td> <td class="text-center text-muted">' . $row['aid'] . '</td>
-
يمكنك استخدام حزمة huawei_account, يجب إنشاء تطبيق لمشروعك في AppGallery Connect. إنشاء مشروع في App Gallery Connect سجّل الدخول إلى AppGallery Connect وحدد مشاريعي. انقر فوق مشروعك من قائمة المشروع. انتقل إلى إعداد المشروع - معلومات عامة - وانقر فوق إضافة التطبيق. إذا كان هناك تطبيق موجود في المشروع ، وتحتاج إلى إضافة تطبيق جديد ، فقم بتوسيع منطقة تحديد التطبيق في الجزء العلوي من الصفحة وانقر فوق إضافة التطبيق. في صفحة إضافة التطبيق ، أدخل معلومات التطبيق ، وانقر فوق موافق. دمج المكوِّن الإضافي لحساب Flutter قم بتسجيل الدخول إلى AppGallery Connect وحدد مشاريعي. ابحث عن مشروع التطبيق الخاص بك ، وانقر فوق اسم التطبيق المطلوب. اذهب إلى إعداد المشروع - معلومات عامة. في قسم معلومات التطبيق ، انقر فوق agconnect-service.json لتنزيل ملف التكوين. قم بإنشاء مشروع Flutter إذا لم يكن لديك واحد. انسخ ملف agconnect-service.json إلى دليل android / app الخاص بمشروع Flutter. انسخ ملف التوقيع الذي تم إنشاؤه في قسم إنشاء شهادة التوقيع ، إلى دليل android / app الخاص بمشروع Flutter. تحقق مما إذا كان ملف agconnect-services.json وملف التوقيع قد تمت إضافتهما بنجاح إلى دليل android / app الخاص بمشروع Flutter. افتح ملف build.gradle في دليل android لمشروع Flutter الخاص بك. انتقل إلى buildscript ثم قم بتكوين عنوان مستودع Maven و agconnect plugin لـ HMS SDK. buildscript { repositories { google() jcenter() maven { url 'https://developer.huawei.com/repo/' } } dependencies { /* * <Other dependencies> */ classpath 'com.huawei.agconnect:agcp:1.4.1.300' } } انتقل إلى allprojects ثم قم بتكوين عنوان مستودع Maven لـ HMS SDK. allprojects { repositories { google() jcenter() maven { url 'https://developer.huawei.com/repo/' } } } افتح ملف build.gradle في دليل android / app. apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply plugin: 'com.huawei.agconnect' يمكنك تصفح الحزمة و معرفة ما تقدمه من خصائص من هنا
- 1 جواب
-
- 1
-
-
يمكنك استخدام inner join فمثلا SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name; أو SELECT select_list FROM t1 INNER JOIN t2 ON join_condition1 INNER JOIN t3 ON join_condition2 ...; ففي حالتك يمكنك استخدام SELECT orderNumber, orderDate, customerName, orderLineNumber, productName, quantityOrdered, priceEach FROM orders INNER JOIN orderdetails USING (orderNumber) INNER JOIN products USING (productCode) INNER JOIN customers USING (customerNumber) ORDER BY orderNumber, orderLineNumber; أو يمكنك قراءة أكثر عن inner join و تطبيق ما تريد باستخدامها
-
أخي ببساطة في ملف .env قم بتغيير APP_DEBUG=true إلى APP_DEBUG=false وهنا لا تظهر إي مشاكل في المتصفح و إذا كنت تريد إيجاد الأخطاء تجدها في ملف logs
- 3 اجابة
-
- 1
-
-
هناك إضافة رائعة يمكن استخدامها وهي woocommerce-wholesale-prices يمكنك من خلال صفحة الإضافة التعامل معها و تضع علامة التخفيض بشكل ممتاز . حدد المنتج الذي تريد تعديله.قم بالتمرير لأسفل إلى قسم بيانات المنتج. في علامة التبويب عام ، ابحث عن العنوان الجديد Wholesale Prices . يمكنك إيضا متابعة شروحات استخدام هذه الإضافة ستجد الأمر سهل جدا في التعامل معها.
- 2 اجابة
-
- 1
-
-
يمكنك تمرير عنوان IP الخاص بالعميل برأس X_FORWARDED_FOR ، وبهذه الطريقة لا يتم حظر عنوان IP للخادم الثاني. Route::get('/', function (Request $request) { $client = new \GuzzleHttp\Client(); $request = $client->request('GET', '/api/example', [ 'headers' => ['X_FORWARDED_FOR' => $request->ip()] ]); $response = $request->getBody(); }); على خادمك الرئيسي ، تحتاج إلى إضافة خادمك الثاني كخادم موثوق به إلى App \ Http \ Middleware \ TrustProxies من أجل الحصول على IP من هذا العنوان. class TrustProxies extends Middleware { protected $proxies = [ '192.168.1.1', // <-- set the ip of the second server here ]; } الآن كل مكالمة إلى $request->ip() على الخادم الرئيسي سيكون لها عنوان IP الأصلي للعميل بدلاً من IP الخاص بالخادم الثاني. سيؤثر ذلك أيضًا على throttling.
-
يمكنك تنفيذ الأمر التالي php artisan vendor:publish --tag=jetstream-views بعد تنفيذ هذا الأمر ستجد UpdateProfileInformationForm في app\Http\Livewire\UpdateProfileInformationForm.php و ملف view في resources\views\profile\update-profile-information-form.blade.php عند القيام بذلك, يمكنك تغييرها كيف ما تريد. إذا لم ينجح الأمر التالي يمكنك إنشاء مجلد Livewire في المسار التالي app\Http\ إذا لم يكن موجود قم بإنشاء ملف UpdateProfileInformationForm.php داخل Livewire و من ثم نسخ ما بداخل \vendor\laravel\jetstream\src\Http\Livewire\UpdateProfileInformationForm.php و في JetstreamServiceProvider قم بنسخ Livewire::component('profile.update-profile-information-form', UpdateProfileInformationForm::class); يمكنك الآن تخصيص إصدارك من UpdateProfileInformationForm وفقًا لاحتياجاتك.
- 3 اجابة
-
- 1
-
-
في JetstreamServiceProvider ضع التالي public function register() { Jetstream::ignoreRoutes(); } و في FortifyServiceProvider ضع التالي public function register() { Fortify::ignoreRoutes(); } وانسخ المسارات من Fortify vendor/laravel/fortify/routes/routes.php و من Jetstream vendor/laravel/jetstream/routes/livewire.php إلى ملف web.php في Group الذي تحتاجه
- 1 جواب
-
- 1
-