如何在php中添加冒号(:)和附加(,)数组值?

时间:2015-10-04 05:22:31

标签: php mysql pdo

我试图以最干净,最有效的方式创建简单的PDO mysql插入查询语句。

我的问题是,php中是否有任何简单的函数可以追加并添加数组值并将其转换为像implode()函数一样的字符串呢?或者我做得对 - (参见我提供的最新工作代码)

如果我错了,请纠正我,implode只是在转换为字符串之前在每个值之间添加一个字符串。希望我的代码将清除更多我想要实现的内容。

//key as field name value as value
$field_values=array(
"firstname"=>$fname,
"lastname"=>$lname,
"phone"=>$phone);

 //field name would work fine as just a comma is appended to each array key
 //i need,if there is  an inline way to perform array values to start with colon and end with comma.
 //this doesn't work as not comma is added inbetween

 $sql="INSERT INTO student (".implode(",",array_keys($field_values).") VALUES (".implode(":",$field_values).")";

 //result wrong no commas
 //INSERT INTO student (firstname,lastname,phone) VALUES (:firstname:lastname:phone);
 //i want this
 //INSERT INTO student (firstname,lastname,phone) VALUES (:firstname,:lastname,:phone);

我也不能使用它

$sql="INSERT INTO student (".implode(",",array_keys($field_values).") VALUES (?,?,?);

我正在使用它来绑定

foreach($field_values as $field=>$value)
{
    $dbh->bindValue(':'.$field,$value);
}

我知道我可以通过编写像:firstname,:lastname,:phone之类的字符串来实现这一点,或者可以使用正则表达式或者使用foreach循环来追加和预先添加。这样可以正常工作但是很长

    $fv="";
    foreach($field_values as $field=>$value)
    {
        $fv.=":".$field.",";
    }
    $fv=rtrim($fv, ",");
    $sql="INSERT INTO student (".implode(",",$field_values).") VALUES (".$fv.")";

但我想知道是否有办法像我上面使用的代码那样做。在场景中,数组键可能会发生变化,因此我正在寻找一种动态有效的方法。

请帮帮我:) 任何帮助表示赞赏。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

此PDO插入函数将接受数组作为输入。

// Insert an array with key-value pairs into a specified MySQL database table.
function pdo_insert($dbh,$table,$keyvals) {
    $sql = sprintf("INSERT INTO %s ( `%s` ) %sVALUES ( :%s );",
        $table,
        implode("`, `", array_keys($keyvals)), 
        implode(", :", array_keys($keyvals))
    );
    $stmt = $dbh->prepare($sql);
    foreach ($keyvals as $field => $value) {
        $stmt->bindValue(":$field", $value, PDO::PARAM_STR);
    }
    $stmt->execute();
    return $dbh->lastInsertId();
}

// Convert special characters to HTML safe entities.
function h($str) {
    return trim(stripslashes(htmlspecialchars($str, ENT_QUOTES, 'utf-8')));
}

示例:

$dbh = new PDO($dsn);
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$keyvals = [                
    'id' => isset($_POST['id']) ? h( $_POST['id'] ) : null, 
    'title' => isset($_POST['title']) ? h( $_POST['title'] ) : null,    
    'description' => isset($_POST['description']) ? h( $_POST['description'] ) : null,
    'created_at' => time(),
    'created_by' => 1,
];
$last_ids[] = pdo_insert($dbh,'products',$keyvals);

答案 1 :(得分:-1)

如果您不想使用foreach添加:对于列名称,您可以尝试这样的事情

$fname = "first";
$lname = "last";
$phone = "2342344";
$field_values=array(
"firstname"=>$fname,
"lastname"=>$lname,
"phone"=>$phone
);

echo  "INSERT INTO student (`:".implode("`,:`",$field_values)."`) VALUES (".$fv.")";

正如您在插入列中看到的,我添加了一个`:到存在并在列括号中结束