Kode PHP eval() dikembalikan dari kueri mysql *tidak berfungsi*

jika saya mengambil dan melakukan sesuatu seperti ini:


    $p = 10;
    $n = 3;
    $evalstr = "\$f = 0.99 + ((.025 * \$p) * \$n);";
    eval($evalstr);
    echo $f;

Saya mendapatkan 1,74 yang ditampilkan, tidak ada kesalahan semuanya baik-baik saja, tetapi ketika saya memiliki tabel mysql yang menampung persamaan ini (untuk tujuan contoh ini, persamaannya sama persis)...seperti:


    $p = 10;
    $n = 3;
    while ($result = mysql_fetch_assoc($results)) {
        $math = $result['math'];
        //at this point $math = "\$f = 0.99 + ((.025 * \$p) * \$n);"
        eval($math);
    }

Saya mendapatkan kesalahan Parse: kesalahan sintaksis, T_VARIABLE tak terduga, mengharapkan T_STRING di ajax\getprices.php(30): kode eval() pada baris 1

Tidak yakin mengapa, jika saya mencetak echo $math apakah itu identik dengan yang saya miliki sebagai $evalstr pada contoh pertama. $p dan $n sebenarnya disetel dari variabel GET tetapi meskipun saya menyetelnya secara manual seperti pada contoh, itu tidak berfungsi.


person Mike L.    schedule 18.10.2011    source sumber
comment
Saran. Cobalah untuk tidak menyimpan PHP Anda dalam database. Jika Anda memiliki kerentanan injeksi sql, seseorang dapat membahayakan seluruh basis kode Anda. Bukan hanya database Anda.   -  person Cyclone    schedule 19.10.2011
comment
ideone.com/T20A4 apakah Anda yakin $math benar-benar seperti yang Anda katakan?   -  person Dejan Marjanović    schedule 19.10.2011
comment
Coba ganti eval() dengan var_dump($math) dan beri tahu kami tepatnya apa yang dicetaknya.   -  person Ilmari Karonen    schedule 19.10.2011


Jawaban (2)


Menurut saya, Anda menyimpan ekspresi termasuk $ yang lolos dalam database. Anda dapat mencoba, jika berhasil, jika Anda menghapus garis miring terlebih dahulu:

eval(stripslashes($math));

Saya juga menyarankan untuk berhati-hati dalam menyimpan kode tersebut di database dan menggunakan eval untuk mengeksekusinya. Ada potensi celah keamanan di sini. Tapi saya berasumsi, Anda tahu ini.

person aurora    schedule 18.10.2011
comment
ini berhasil, jawaban yang sama yang saya berikan, saya menghapus garis miring secara manual (hanya 18 persamaan) dan keamanan tidak ada masalah di sini, terima kasih - person Mike L.; 19.10.2011

Saya mengerti, sepertinya ketika mendefinisikan kode eval sebagai variabel saya harus keluar dari $ tetapi ketika menariknya dari mysql sebagai variabel itu berfungsi jika saya menghapus $

person Mike L.    schedule 18.10.2011