Soalan:
Untuk menjana kod bar unik, fungsi rekursif ialah digunakan untuk memastikan tiada entri pendua wujud dalam pangkalan data. Walau bagaimanapun, fungsi kadangkala mengembalikan "Tidak Ditetapkan" dan bukannya nombor unik. Tentukan punca dan berikan pembetulan untuk kod yang cacat di bawah:
function generate_barcode() { $barcode = rand(1, 10); $bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'")); if ($bquery == 1) generate_barcode(); else return $barcode; }
Jawapan:
Isunya terletak pada ketiadaan penyata pengembalian panggilan rekursif. Ini bermakna fungsi tidak mengembalikan nombor yang dijana dalam cawangan rekursi itu, yang berpotensi membawa kepada ralat "Tidak Ditetapkan".
Untuk membetulkannya, ubah suai panggilan rekursif untuk mengembalikan nombor yang dijana:
function generate_barcode() { $barcode = rand(1, 10); $bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'")); if ($bquery == 1) return generate_barcode(); // changed! else return $barcode; }
Pertimbangan Tambahan:
Untuk mengelakkan pengulangan tak terhingga dalam kes di mana semua nombor adalah terpelihara, adalah penting untuk memasukkan syarat yang menghentikan pengulangan dan menimbulkan ralat, seperti:
if ($recursiveCalls > 1000) // or any suitable limit throw new Exception('Failed to generate a unique barcode within the specified limit.');
Dengan memasukkan pengubahsuaian ini, fungsi akan secara konsisten mengembalikan kod bar unik dan mengendalikan kes tepi semua nombor diambil.
Atas ialah kandungan terperinci Mengapa Penjana Kod Bar PHP Rekursif Saya Kadang-kadang Kembali 'Tidak Ditetapkan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!