☰ خطة العام · تكنولوجيا المعلومات والاتصالات (بالعربية)

المحوّل كصفحة ويب بلغة PHP

الأسبوع 7 · الوحدة ١ الموضوع الثالث: محوّل الأعداد كصفحة ويب بلغة PHP: النموذج وأدوات التحكم وكود PHP وعرض النتيجة · 3 دروس
3

عرض النتيجة والتحقق من المدخلات

ICT Secondary 3 Term 1, Unit 1, Topic 3: pp. 37–50
الهدفاعرض النتائج بـ echo، وانظر ماذا يفعل الإدخال الخاطئ، واجعل الصفحة أكثر أمانًا بفحص المدخلات قبل التحويل.
كلمات جديدة
التحقق من المدخلات ⁦(input validation)⁩ · فحص النص المكتوب قبل استعماله⁦preg_match⁩ · تختبر هل يطابق النص نمطًا، مثل أن يحوي الرمزين 0 و1 فقطhtmlspecialchars · تحوّل رموزًا مثل < و' إلى نص غير ضار قبل أن تطبعه الصفحةTypeError · الخطأ الذي يثيره PHP حين تستلم دالة قيمة من نوع خاطئ؛ وتتوقف الصفحة
الشرح

تظهر النتيجة في الصفحة بـ 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 و132 رمزًا
عشريمن 0 إلى 99 أرقام
سداسي عشريمن 0 إلى 9 ومن A إلى F ومن a إلى f8 رموز
أمثلة محلولة
Php
1try {
2    echo decbin("abc");
3} catch (TypeError $error) {
4    echo $error->getMessage();
5}
Output
decbin(): Argument #1 ($num) must be of type int, string given
ماذا يفعل ⁦PHP 8⁩ بنص خاطئ في الصفحة غير المفحوصة. هذه الحالة الأولى، وقد أمسكنا بها بـ try وcatch لنقرأ الرسالة.
الزرالمكتوبماذا تفعل الصفحة غير المفحوصة
عشريabcتتوقف الصفحة بخطأ TypeError
ثنائي102تتجاهل 2 وتقرأ 10 فقط فتعرض العشري 2، وسطر الثنائي يعرض 102
سداسي عشريxyzتعرض العشري 0
عشري⁦-3⁩تعرض 64 رقمًا ثنائيًا: واحد وستون رقم 1 يليها 101
بقية الإدخالات الخاطئة على الصفحة غير المفحوصة. وتعرض الصفحة أيضًا أي نص مكتوب نتيجةً ثنائية حين يُضغط الزر الثنائي، فتظهر الأرقام الخاطئة كأنها «ثنائية».
Php
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");
Output
1011 11 B
1010000000 640 280
1111111 127 7F
invalid input
invalid input
محوّل أكثر أمانًا: دالة واحدة تفحص النص بنمط أولًا وتعيد ⁦invalid input⁩ إذا لم يطابق. وأسطر الناتج من تشغيلها فعلًا.
Php
1echo htmlspecialchars("5' x");
Output
5&#039; x
نستعمل htmlspecialchars قبل أن نطبع النص المكتوب من جديد. فتصير الفاصلة العليا رمزًا غير ضار.
نشاط الفصل

قرّر ماذا يفعل المحوّل المفحوص بكل إدخال وعلّل: (أ) 1021 مع الزر الثنائي، (ب) 7f مع الزر السداسي عشري، (ج) ⁦12 34⁩ (وفيه مسافة) مع الزر العشري، (د) 640 مع الزر العشري. وللإدخالات المقبولة اكتب النتائج الثلاث.

تدرّب
1
ماذا تفعل ⁦decbin("abc")⁩ في ⁦PHP 8⁩؟
2
لماذا يعدّ 102 إدخالًا خاطئًا للزر الثنائي؟
3
ماذا تفعل htmlspecialchars؟
4
أي فكرة نمط تناسب إدخالًا سداسيًا عشريًا؟