mysql_* تم حذفها بالكامل. المشروع يستخدمها في 38 ملف.
يجب استبدالها بـ mysqli_* أو PDO مع prepared statements.
| الملف | العدد | الدوال المستخدمة |
|---|---|---|
| controllers/transferdatabaseController.php | 368 | mysql_connect, mysql_query, mysql_fetch_array, mysql_select_db, mysql_error |
| controllers/transferdatabasenoraController.php | 346 | mysql_connect, mysql_query, mysql_fetch_array, mysql_select_db |
| controllers/transferdatabaseControllerYasmeen.php | 226 | mysql_connect, mysql_query, mysql_fetch_array, mysql_select_db |
| controllers/archive2Controller.php | 54 | mysql_connect, mysql_query, mysql_fetch_array, mysql_fetch_row, mysql_error |
| controllers/transferdatabaseAjaxController.php | 32 | mysql_connect, mysql_query, mysql_fetch_array |
| controllers/profitandlossCTRL.php | 21 | mysql_connect, mysql_query, mysql_fetch_array |
| views/default/js/jstree-v.pre1.0/_demo/_inc/class._database.php | 18 | mysql_connect, mysql_pconnect, mysql_select_db, mysql_free_result, mysql_num_rows |
| views/default/extras/Scroller/media/data/server_processing.php | 13 | mysql_connect, mysql_query, mysql_real_escape_string |
| controllers/archiveController.php | 13 | mysql_connect, mysql_query, mysql_fetch_array |
| controllers/backupController.php | 10 | mysql_connect, mysql_query, mysql_fetch_row, mysql_close |
// ❌ الكود القديم (PHP 5.6)
$conn = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $conn);
$result = mysql_query("SELECT * FROM users WHERE id = $id");
$row = mysql_fetch_array($result);
$escaped = mysql_real_escape_string($input);
// ✅ الكود الجديد (PHP 8.2 - PDO)
$conn = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// ✅ أو باستخدام MySQLi
$conn = new mysqli($host, $user, $pass, $dbname);
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
each() تم حذفها نهائياً. يجب استبدالها بـ foreach.
| الملف | العدد | النوع |
|---|---|---|
| controllers/api/_library/redBean/rb.php | 41 | مكتبة RedBean (نسخة API) |
| controllers/studentsReports.php | 28 | كود التطبيق |
| library/Classes/PHPExcel/Reader/Excel2003XML.php | 23 | مكتبة PHPExcel |
| library/Classes/PHPExcel/Calculation.php | 23 | مكتبة PHPExcel |
| library/Classes/PHPExcel/Calculation/MathTrig.php | 21 | مكتبة PHPExcel |
| library/PHPMailer/PHPMailer.php | 11 | مكتبة PHPMailer |
| public/libs/sysplugins/smarty_internal_utility.php | 5 | مكتبة Smarty |
// ❌ الكود القديم
while (list($key, $value) = each($array)) {
echo "$key => $value";
}
reset($array);
while (list(, $line) = @each($lines)) {
echo $line;
}
// ✅ الكود الجديد
foreach ($array as $key => $value) {
echo "$key => $value";
}
foreach ($lines as $line) {
echo $line;
}
ereg(), ereg_replace() و split() تم حذفها. يجب استخدام preg_* بدلاً منها.
| الملف | الدالة | السطر |
|---|---|---|
| controllers/archive2Controller.php | ereg_replace() |
450 |
| library/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php | ereg() |
3396, 4777 |
// ❌ القديم
ereg_replace("\n", "\\n", $row[$j]);
ereg('^(.*)\/$', $path);
// ✅ الجديد
preg_replace("/\n/", "\\n", $row[$j]);
preg_match('/^(.*)\/$/', $path);
$string{0} للوصول لحروف النص أو عناصر المصفوفة تم حذفه.
يجب استبداله بـ $string[0].
| الملف | العدد |
|---|---|
| library/Classes/PHPExcel/Cell.php | 12+ |
| library/Classes/PHPExcel/Reader/Excel5/Escher.php | 10+ |
| library/Classes/PHPExcel/Worksheet/AutoFilter.php | 8+ |
| library/Classes/PHPExcel/Shared/String.php | 6+ |
| library/Classes/PHPExcel/Writer/Excel5/Worksheet.php | 5+ |
| library/Classes/PHPExcel/Reader/SYLK.php | 8+ |
| controllers/apiend/api/_library/newUplode/class.upload.php | 3+ |
// ❌ القديم
$char = $string{0};
if (isset($pString{1})) { ... }
// ✅ الجديد
$char = $string[0];
if (isset($pString[1])) { ... }
openssl_encrypt() أو مكتبة Sodium.
| الملف | الدوال | الأسطر |
|---|---|---|
| library/tcpdf/include/tcpdf_static.php | mcrypt_create_iv, mcrypt_encrypt, mcrypt_get_iv_size |
453, 454, 475, 476, 493 |
| library/tcpdf/tcpdf.php | mcrypt extension check |
10924-10930 |
// ❌ القديم
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
// ✅ الجديد
$iv = random_bytes(openssl_cipher_iv_length('aes-128-cbc'));
$encrypted = openssl_encrypt($text, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
get_magic_quotes_gpc(), get_magic_quotes_runtime(), set_magic_quotes_runtime() تم حذفها.
| الملف | الدوال |
|---|---|
| library/PHPMailer/PHPMailer.php | get_magic_quotes_runtime(), set_magic_quotes_runtime() |
| library/tcpdf/include/tcpdf_static.php | set_magic_quotes_runtime(), get_magic_quotes_runtime() |
| library/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php | get_magic_quotes_runtime() |
| controllers/api/_library/phpMailer/PHPMailer.php | get_magic_quotes_runtime() |
// ❌ القديم
$magic_quotes = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
// ... عمليات الملف ...
set_magic_quotes_runtime($magic_quotes);
// ✅ الجديد — حذف الكود بالكامل (لم يعد ضرورياً)
// magic_quotes لم تعد موجودة في PHP 8.2
utf8_encode() و utf8_decode() تم حذفها. يجب استخدام mb_convert_encoding().
| الملف | الدالة | السطر |
|---|---|---|
| controllers/clientdebt.php | utf8_encode() |
417 |
| controllers/archive2Controller.php | utf8_decode() |
363 (معلق) |
// ❌ القديم
$encoded = utf8_encode($string);
$decoded = utf8_decode($string);
// ✅ الجديد
$encoded = mb_convert_encoding($string, 'UTF-8', 'ISO-8859-1');
$decoded = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');
| المكتبة | الإصدار الحالي | الإصدار المطلوب | الإجراء |
|---|---|---|---|
| PHPExcel | 1.8.0 (2014) | PhpSpreadsheet 2.x | استبدال كامل — PHPExcel متوقفة عن التطوير |
| PHPMailer | 5.2.6 (2012) | 6.9+ | ترقية مع تعديل namespace و autoload |
| TCPDF | 6.3.1 (2019) | 6.7+ | ترقية — إصلاح mcrypt |
| RedBeanPHP | 4.2 | 5.7+ | ترقية — يستخدم PDO (آمن) |
| Smarty | 3.1-DEV | 4.x أو 5.x | ترقية مع مراجعة Templates |
| jQuery | 1.8.2 (2012) | 3.7+ | ترقية — ثغرات أمنية معروفة |
| Bootstrap | 3.3.7 (2016) | 5.3+ | ترقية اختيارية — تغييرات واجهة كبيرة |
| PCLZip | قديم | ZipArchive (PHP built-in) | استبدال بمكتبة PHP المدمجة |
#[\AllowDynamicProperties].
هذه المشكلة منتشرة في الكود القديم خاصة في Smarty و RedBeanPHP.
// ❌ القديم — PHP 8.2 يعطي Deprecation Warning
class User {
public $name;
}
$user = new User();
$user->age = 25; // خاصية غير معرفة!
// ✅ الجديد — تعريف الخصائص مسبقاً
class User {
public string $name;
public int $age; // معرفة مسبقاً
}
// أو استخدام Attribute
#[\AllowDynamicProperties]
class LegacyUser {
public $name;
}
public/config.php سطر 49 يستخدم SET NAMES latin1.
يجب التحويل إلى utf8mb4 لدعم اللغة العربية والإيموجي بشكل صحيح.
// ❌ القديم (config.php:49)
R::exec('SET NAMES latin1');
// ✅ الجديد
R::exec('SET NAMES utf8mb4');
| # | المشكلة | العدد | الخطورة | الإجراء | النوع |
|---|---|---|---|---|---|
| 1 | دوال mysql_* |
1,188 | حرج | تحويل إلى PDO/MySQLi | كود التطبيق |
| 2 | دالة each() |
654 | حرج | استبدال بـ foreach | كود + مكتبات |
| 3 | أقواس معقوفة {} |
96 | عالي | استبدال بـ [] | مكتبات |
| 4 | Magic Quotes | 14 | عالي | حذف الكود | مكتبات |
| 5 | دوال ereg_* |
12 | حرج | استبدال بـ preg_* | كود + مكتبات |
| 6 | دوال mcrypt_* |
8 | حرج | استبدال بـ OpenSSL | مكتبة TCPDF |
| 7 | utf8_encode/decode |
2 | عالي | استبدال بـ mb_convert_encoding | كود التطبيق |
| 8 | مكتبات قديمة | 6 | حرج | ترقية/استبدال | مكتبات |
| 9 | Dynamic Properties | غير محدد | متوسط | تعريف الخصائص | كود + مكتبات |
| 10 | ترميز latin1 | 1 | متوسط | تحويل لـ utf8mb4 | إعدادات |
الهدف: استبدال جميع المكتبات القديمة بإصدارات متوافقة مع PHP 8.2
composer.json في جذر المشروعالهدف: تحويل 1,188 استخدام من mysql_* إلى PDO/MySQLi مع prepared statements
الهدف: إصلاح each(), ereg_*, mcrypt_*, magic_quotes, utf8_encode/decode
each() بـ foreachereg_* بـ preg_*{} بأقواس []الهدف: معالجة التحذيرات والتوافق الكامل مع PHP 8.2
#[\AllowDynamicProperties] أو تعريف الخصائصdeclare(strict_types=1) تدريجياًerror_reporting(E_ALL) ومعالجة التحذيراتالهدف: التأكد من عمل النظام بالكامل على PHP 8.2
| # | الملف | عدد المشاكل | النوع الرئيسي | شريط التأثير |
|---|---|---|---|---|
| 1 | controllers/transferdatabaseController.php | 368 | mysql_* | |
| 2 | controllers/transferdatabasenoraController.php | 346 | mysql_* | |
| 3 | controllers/transferdatabaseControllerYasmeen.php | 226 | mysql_* | |
| 4 | controllers/archive2Controller.php | 55 | mysql_* + ereg | |
| 5 | controllers/api/_library/redBean/rb.php | 41 | each() | |
| 6 | controllers/transferdatabaseAjaxController.php | 32 | mysql_* | |
| 7 | controllers/studentsReports.php | 28 | each() | |
| 8 | library/Classes/PHPExcel/ (كامل) | 200+ | each() + {} | |
| 9 | controllers/profitandlossCTRL.php | 21 | mysql_* | |
| 10 | views/.../class._database.php | 18 | mysql_* | |
| 11 | library/PHPMailer/PHPMailer.php | 14 | each() + magic_quotes | |
| 12 | controllers/archiveController.php | 13 | mysql_* | |
| 13 | views/.../server_processing.php | 13 | mysql_* | |
| 14 | controllers/backupController.php | 10 | mysql_* | |
| 15 | library/tcpdf/include/tcpdf_static.php | 8 | mcrypt_* + magic_quotes |
| الإصلاح | من | إلى | العدد |
|---|---|---|---|
| أقواس معقوفة | $str{0} |
$str[0] |
96 |
| ereg_replace | ereg_replace(pattern, ...) |
preg_replace('/pattern/', ...) |
12 |
| utf8 functions | utf8_encode() |
mb_convert_encoding($s,'UTF-8','ISO-8859-1') |
2 |
| DB Charset | SET NAMES latin1 |
SET NAMES utf8mb4 |
1 |
| Magic Quotes | get_magic_quotes_runtime() |
حذف الكود | 14 |
| ملفات JS في views/ | 1,806 |
| ملفات JS في controllers/ | 365 |
| إجمالي ملفات JS | 2,171 |
| إجمالي أسطر JS | 221,973 |
| إجمالي ملفات HTML | 1,922 |
HTML فيها <script> | 1,138 |
عدد <script> tags | 2,462 |
PHP فيها <script> | 99 |
| أسطر Inline JS تقريباً | ~66,675 |
$.post() | 442 |
$.ajax() | 405 |
$.get() | 293 |
XMLHttpRequest | 65 |
fetch() | 0 |
| الإجمالي | 1,205 |
| jQuery | 1.8.2 (2012) |
| Bootstrap | 3.3.7 (2016) |
| DataTables | 1.9.4 |
| jQuery Validation | 1.14.0 |
| CKEditor | 4.5.9 |
| CanvasJS | 3.2.17 |
| Select2 | قديم |
.live() تم حذفها في jQuery 1.9 (2013). هذا أخطر مشكلة لأن الكود لن يعمل مع أي إصدار jQuery حديث.
يوجد 460 استخدام في المشروع يجب تحويلها جميعاً لـ .on().
// ❌ محذوف من jQuery 1.9 — لن يعمل!
$('.btn-delete').live('click', function() {
$(this).closest('tr').remove();
});
$('.dynamic-input').live('change', function() {
calculateTotal();
});
$('.edit-row').live('dblclick', function() {
editRow($(this));
});
// ✅ الطريقة الصحيحة مع jQuery 3.7+
$(document).on('click', '.btn-delete', function() {
$(this).closest('tr').remove();
});
$(document).on('change', '.dynamic-input', function() {
calculateTotal();
});
$(document).on('dblclick', '.edit-row', function() {
editRow($(this));
});
document:$('#myTable').on('click', '.btn-delete', handler) — أسرع وأدق.
.bind() (344 استخدام) و .unbind() (100 استخدام) تم حذفها.
يجب استخدام .on() و .off() بدلاً منها.
| الدالة القديمة | العدد | البديل | محذوفة من |
|---|---|---|---|
.bind() |
344 | .on() |
jQuery 3.0 |
.unbind() |
100 | .off() |
jQuery 3.0 |
.delegate() |
25 | .on() |
jQuery 3.0 |
.undelegate() |
2 | .off() |
jQuery 3.0 |
.die() |
8 | .off() |
jQuery 1.9 |
// ❌ القديم
$('#myBtn').bind('click', handler);
$('#myBtn').unbind('click', handler);
$('#parent').delegate('.child', 'click', handler);
$('#parent').undelegate('.child', 'click');
$('.item').die('click');
// ✅ الجديد
$('#myBtn').on('click', handler);
$('#myBtn').off('click', handler);
$('#parent').on('click', '.child', handler);
$('#parent').off('click', '.child');
$(document).off('click', '.item');
| الدالة القديمة | العدد | البديل في JS | محذوفة من |
|---|---|---|---|
$.isFunction() |
426 | typeof x === 'function' |
jQuery 3.3 |
$.isArray() |
312 | Array.isArray() |
jQuery 3.3 |
$.trim() |
242 | str.trim() |
jQuery 3.5 |
$.parseJSON() |
155 | JSON.parse() |
jQuery 3.2 |
$.type() |
63 | typeof / instanceof |
jQuery 3.3 |
// ❌ القديم — محذوف من jQuery 3.x
if ($.isFunction(callback)) callback();
if ($.isArray(data)) data.forEach(...);
var name = $.trim(input.val());
var obj = $.parseJSON(response);
if ($.type(val) === 'string') { ... }
// ✅ الجديد — JavaScript أصلي
if (typeof callback === 'function') callback();
if (Array.isArray(data)) data.forEach(...);
var name = input.val().trim();
var obj = JSON.parse(response);
if (typeof val === 'string') { ... }
.click(), .change(), .focus() بدون arguments (للتفعيل) deprecated.
استخدامها لربط handler لا يزال يعمل لكن الأفضل استخدام .on().
| النمط | العدد | الحالة |
|---|---|---|
.click() بدون arguments |
2,982 | deprecated trigger |
.change() بدون arguments |
641 | deprecated trigger |
.focus() بدون arguments |
352 | deprecated trigger |
.size() |
19 | محذوفة |
.andSelf() |
10 | محذوفة |
.error() handler |
121 | محذوفة |
// ❌ القديم
$('#btn').click(); // trigger — deprecated
$('#select').change(); // trigger — deprecated
$('.input').focus(); // trigger — deprecated
$('#list li').size(); // محذوفة!
$('.items').find('.a').andSelf(); // محذوفة!
$('img').error(function() { ... }); // محذوفة!
// ✅ الجديد
$('#btn').trigger('click'); // explicit trigger
$('#select').trigger('change'); // explicit trigger
$('.input').trigger('focus'); // explicit trigger
$('#list li').length; // .length بدل .size()
$('.items').find('.a').addBack(); // .addBack() بدل .andSelf()
$('img').on('error', function() { ... }); // .on('error') بدل .error()
| المكتبة | الإصدار الحالي | الإصدار المطلوب | التأثير على الكود | الأولوية |
|---|---|---|---|---|
| jQuery | 1.8.2 (2012) | 3.7.1 | 5,720+ تعديل — تغييرات كبيرة جداً | حرج |
| DataTables | 1.9.4 | 2.1+ | تغييرات في API — fnGetData → rows().data() | حرج |
| Bootstrap | 3.3.7 (2016) | 5.3+ | تغييرات كبيرة في CSS classes والـ JS API | عالي |
| jQuery Validation | 1.14.0 | 1.21+ | تغييرات طفيفة | متوسط |
| CKEditor | 4.5.9 | 4.22+ أو CKEditor 5 | ترقية بسيطة لو بقينا على 4.x | متوسط |
| Select2 | قديم | 4.1+ | API مختلف بالكامل من 3.x ل 4.x | عالي |
| CanvasJS | 3.2.17 | 3.9+ | تحديث بسيط — backward compatible | منخفض |
| # | المشكلة | العدد | الخطورة | الإجراء |
|---|---|---|---|---|
| 1 | .click() بدون args (trigger) |
2,982 | متوسط | استبدال بـ .trigger('click') أو .on('click', fn) |
| 2 | .live() |
460 | حرج | استبدال بـ .on() |
| 3 | $.isFunction() |
426 | حرج | typeof === 'function' |
| 4 | .bind() |
344 | حرج | استبدال بـ .on() |
| 5 | $.isArray() |
312 | حرج | Array.isArray() |
| 6 | $.trim() |
242 | عالي | .trim() |
| 7 | $.parseJSON() |
155 | عالي | JSON.parse() |
| 8 | .error() handler |
121 | حرج | .on('error', fn) |
| 9 | .unbind() |
100 | حرج | .off() |
| 10 | $.type() |
63 | عالي | typeof |
| 11 | .delegate() |
25 | حرج | .on(event, selector, fn) |
| 12 | .size() |
19 | حرج | .length |
| 13 | .andSelf() |
10 | حرج | .addBack() |
| 14 | .die() |
8 | حرج | .off() |
| 15 | .undelegate() |
2 | حرج | .off() |
| الإجمالي | 5,720+ | |||
jquery-migrate تسمح بالترقية التدريجية. تعرض تحذيرات في console بدل ما تكسر الكود.
jquery-migrate-1.4.1.js.live() (460) و .die() (8) — محذوفة من 1.9jquery-migrate-3.4.1.js.bind() (344), .unbind() (100), .delegate() (25).size() (19), .andSelf() (10), .error() (121)$.isFunction() (426) بـ typeof === 'function'$.isArray() (312) بـ Array.isArray()$.trim() (242) بـ .trim()$.parseJSON() (155) بـ JSON.parse()$.type() (63) بـ typeofjquery-migrate| المرحلة | الوصف | النوع | عدد التعديلات | الأولوية |
|---|---|---|---|---|
| 1 | ترقية مكتبات PHP — PHPExcel→PhpSpreadsheet, PHPMailer 6.9, TCPDF 6.7, RedBeanPHP 5.7, Smarty 4.x | PHP | 6 مكتبات | حرج |
| 2 | تحويل mysql_* — إنشاء Database Helper + تحويل 1,188 استخدام لـ PDO | PHP | 1,188 | حرج |
| 3 | إصلاح PHP المتبقي — each(), ereg_*, mcrypt_*, magic_quotes, {}, utf8 | PHP | 776 | عالي |
| 4 | ترقية jQuery — 1.8.2 → 3.7.1 + jquery-migrate + إصلاح .live(), .bind(), .die() | JS | 939 | حرج |
| 5 | إصلاح jQuery utilities — $.isFunction, $.isArray, $.trim, $.parseJSON, $.type | JS | 1,198 | عالي |
| 6 | ترقية مكتبات JS — DataTables 2.x, Bootstrap 5.3, Select2 4.x, CKEditor | JS | 5 مكتبات | عالي |
| 7 | اختبار شامل + نشر — بيئة staging + اختبار كل الوظائف + نشر production | كلاهما | — | حرج |
| إجمالي التعديلات المطلوبة | ~7,700+ |
find & replace (بحث واستبدال) تلقائياً.
مثلاً: .bind( → .on( و $.trim(x) → x.trim().
هذا يقلل الجهد الفعلي بشكل كبير.
تم إنشاء هذا التقرير تلقائياً — Simple ERP Full Upgrade Analysis
PHP: 5.6 → 8.2 | jQuery: 1.8.2 → 3.7+ | Bootstrap: 3.3.7 → 5.3+
التاريخ: 5 أبريل 2026