我试图以最干净,最有效的方式创建简单的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.")";
但我想知道是否有办法像我上面使用的代码那样做。在场景中,数组键可能会发生变化,因此我正在寻找一种动态有效的方法。
请帮帮我:) 任何帮助表示赞赏。
提前谢谢。
答案 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.")";
正如您在插入列中看到的,我添加了一个`:到存在并在列括号中结束