عرض النتيجة والتحقق من المدخلات
تظهر النتيجة في الصفحة بـ echo داخل فقرة، مثل <p>Decimal: <?php echo $dec; ?></p>. والمشكلة أن الزائر يستطيع أن يكتب أي شيء، وصفحتنا لا تفحص. في PHP 8 تثير decbin("abc") الخطأ TypeError فتتوقف الصفحة؛ وتتجاهل bindec("102") الرمز 2 فتقرأ 10 فقط وتعيد 2، وقد يطبع PHP حسب الإعدادات تنبيهًا باسم Deprecated؛ وتعيد hexdec("xyz") القيمة 0. فالقاعدة: لا تثق بنص كتبه المستخدم، وافحصه أولًا. والنمط يقول ما المسموح: في الثنائي الرمزان 0 و1 فقط وعلى الأكثر ٣٢ رمزًا؛ وفي العشري أرقام فقط وعلى الأكثر تسعة؛ وفي السداسي عشري من 0 إلى 9 ومن A إلى F بأي حالة وعلى الأكثر ثمانية رموز. فإذا لم يطابق النص النمط قالت الصفحة «invalid input» ولم تحوّل. وثانيًا، النص المكتوب الذي يُطبع من جديد في الصفحة يجب أن يمر عبر htmlspecialchars التي تحوّل الرموز الخاصة إلى نص غير ضار. ونستعمل حالة واحدة غير ضارة هي علامة الفاصلة العليا.
| النظام | الرموز المسموحة | أطول نص |
|---|---|---|
| ثنائي | 0 و1 | 32 رمزًا |
| عشري | من 0 إلى 9 | 9 أرقام |
| سداسي عشري | من 0 إلى 9 ومن A إلى F ومن a إلى f | 8 رموز |
1try { 2 echo decbin("abc"); 3} catch (TypeError $error) { 4 echo $error->getMessage(); 5}
decbin(): Argument #1 ($num) must be of type int, string given
| الزر | المكتوب | ماذا تفعل الصفحة غير المفحوصة |
|---|---|---|
| عشري | abc | تتوقف الصفحة بخطأ TypeError |
| ثنائي | 102 | تتجاهل 2 وتقرأ 10 فقط فتعرض العشري 2، وسطر الثنائي يعرض 102 |
| سداسي عشري | xyz | تعرض العشري 0 |
| عشري | -3 | تعرض 64 رقمًا ثنائيًا: واحد وستون رقم 1 يليها 101 |
1function convert(string $text, string $from): string { 2 $text = trim($text); 3 $patterns = [ 4 'bin' => '/^[01]{1,32}$/', 5 'dec' => '/^[0-9]{1,9}$/', 6 'hex' => '/^[0-9A-Fa-f]{1,8}$/', 7 ]; 8 if (!isset($patterns[$from]) || !preg_match($patterns[$from], $text)) { 9 return "invalid input"; 10 } 11 $dec = match ($from) { 12 'bin' => bindec($text), 13 'dec' => (int)$text, 14 'hex' => hexdec($text), 15 }; 16 return decbin($dec) . " " . $dec . " " . strtoupper(dechex($dec)); 17} 18 19echo convert("1011", "bin"), "\n"; 20echo convert("640", "dec"), "\n"; 21echo convert("7f", "hex"), "\n"; 22echo convert("1021", "bin"), "\n"; 23echo convert("", "dec");
1011 11 B 1010000000 640 280 1111111 127 7F invalid input invalid input
1echo htmlspecialchars("5' x");5' x
قرّر ماذا يفعل المحوّل المفحوص بكل إدخال وعلّل: (أ) 1021 مع الزر الثنائي، (ب) 7f مع الزر السداسي عشري، (ج) 12 34 (وفيه مسافة) مع الزر العشري، (د) 640 مع الزر العشري. وللإدخالات المقبولة اكتب النتائج الثلاث.