如何用数组中的元素替换char的所有出现


How to replace all occurencies of char with elements from array?

我有以下字符串:

$sql = sql_prepare("UPDATE `test` SET `item1` = ?, `item2` = ?, `item3` = ?", array(50, 55, 60));

我需要创建"sql_prepare"函数,该函数将匹配'?'字符并替换为数组中的元素,因此最终SQL将为:

UPDATE `test` SET `item1` = 50, `item2` = 55, `item3` = 60

我该怎么做呢?

当mysqli和PDO实现真正的准备语句时,为什么要尝试使用遗留的mysql_* API伪造准备语句?

PDO的例子:

if ($prepped = $pdo -> prepare ('UPDATE `test` SET `item1` = ?, `item2` = ?, `item3` = ?'))
{
    $res = $prepped -> execute (array (50, 55 ,60));
}

对于这样一个简单的替换,您可以使用sprintf格式:

$sql = vsprintf("UPDATE `test` SET `item1` = %d, `item2` = %d, `item3` = %d", 
                 array(50, 55, 60));
但是,对于实际使用,最好使用不同类型的占位符

下面是我的db类

的代码
private function prepareQuery($args)
{
    $raw = $query = array_shift($args);
    preg_match_all('~('?[a-z?])~',$query,$m,PREG_OFFSET_CAPTURE);
    $pholders = $m[1];
    $count = 0;
    foreach ($pholders as $i => $p)
    {
        if ($p[0] != '??')
        {
             $count++;
        }
    }
    if ( $count != count($args) )
    {
        throw new E_DB_MySQL_parser("Number of args (".count($args).") doesn't match number of placeholders ($count) in [$raw]");
    }
    $shift  = 0;
    $qmarks = 0;
    foreach ($pholders as $i => $p)
    {
        $pholder = $p[0];
        $offset  = $p[1] + $shift;
        if ($pholder != '??')
        {
            $value   = $args[$i-$qmarks];
        }
        switch ($pholder)
        {
            case '?n':
                $value = $this->escapeIdent($value);
                break;
            case '?s':
                $value = $this->escapeString($value);
                break;
            case '?i':
                $value = $this->escapeInt($value);
                break;
            case '?a':
                $value = $this->createIN($value);
                break;
            case '?u':
                $value = $this->createSET($value);
                break;
            case '??':
                $value = '?';
                $qmarks++;
                break;
            default:
                throw new E_DB_MySQL_parser("Unknown placeholder type ($pholder) in [$raw]");
        }
        $query = substr_replace($query,$value,$offset,2);
        $shift+= strlen($value) - strlen($pholder);
    }
    $this->lastquery = $query;
    return $query;
}

我不得不承认,转义?标记的解决方案并不是那么优雅,但这就是我目前所得到的。