Parametreleri bağlamak ve adodb veri eklemek için nasıl anlamak

4 Cevap php

Ben bunun içinde tırnak vardı benim db içine metin eklemek, böylece bağlama parametreleri kullanmak için söylendi. Ama bunu yapmak için nasıl geldiğinde, komutları bana kafa karıştırıcı gibi görünüyor oldukça karıştı.

Yani, ben html bulunan bir php dize, nasıl bağlama parametreleri kullanarak benim DB içine bu eklemek istiyorsunuz olsaydı?

Bunu INSERT istedim, ben bunu nasıl yaparım?

$str = '<div id="test"><a href="#">Test string in db</a></div> string content';

Gibi bir şey kullanmak için söylendi:

$rs = $db->Execute('select * from table where val=?', array('10'));

4 Cevap

Ben bir süre için ADODB kullanılmış değil ama ben bu işe gerektiğine inanıyorum, hayır?

$str = '<div id="test"><a href="#">Test string in db</a></div> string content';
$rs = $db->Execute('select * from table where val=?', array($str));

SQL? 'Nin ifadesine bağlı değerler için yer tutucu olarak hizmet vermektedir.

Çalıştırıldığında, ADO (sizin örnek verilir) yürütülüyor

select * from table where val=10

Sen kabaca olarak insert SQL oluşturmak gerekir:

INSERT INTO `table` (`col1`, `col2` ...) VALUES(?, ? ...)

(Doğru sırayla) kendi değerleri geçen uygun sorgu verecek.

mysql_real_escape_string de hile yapmak gerekir kullanarak, size, veritabanına veri eklemek, bu örneği dikkate hangi sonra otomatik olarak tırnak kaçar:

$str = '<div id="test"><a href="#">Test string in db</a></div> string content';
$str_escaped = mysql_real_escape_string($str);

Şimdi güvenle veritabanına veri eklemek için $str_escaped değişkeni kullanabilirsiniz. Ayrıca, SQL enjeksiyon saldırıları önlemede yararlıdır.

CodeIgniter çerçeve uyarlanmıştır:

function compile_binds($sql, $binds)
{
    if (strpos($sql, '?') === FALSE)
    {
        return $sql;
    }

    if ( ! is_array($binds))
    {
        $binds = array($binds);
    }

    // Get the sql segments around the bind markers
    $segments = explode('?', $sql);

    // The count of bind should be 1 less then the count of segments
    // If there are more bind arguments trim it down
    if (count($binds) >= count($segments)) {
        $binds = array_slice($binds, 0, count($segments)-1);
    }

    // Construct the binded query
    $result = $segments[0];
    $i = 0;
    foreach ($binds as $bind)
    {
        $result .= mysql_real_escape_string($bind);
        $result .= $segments[++$i];
    }

    return $result;
}

Sonra bir işlevi olabilir:

function query($sql, $binds)
{
    return $db->Execute(compile_binds($sql, $binds));
}

$query = query('select * from table where val=?', array('10'));