gpt4 book ai didi

php - mysql_query 到 PDO 和准备好的语句

转载 作者:可可西里 更新时间:2023-11-01 08:07:44 24 4
gpt4 key购买 nike

我的 CMS 中有这个功能,它将字段和值的可变列表插入到两个不同的表中;一个是静态索引表,一个是动态的。这是函数:

function insertFields($fields)
{
$stdfields = array();
$extfields = array();

/* Separate the fields based on if the fields is standard or extra. $this->fields is a csv list of the defined extra fields */
foreach($fields as $field => $value)
{
$fields[mysql_real_escape_string($field)] = mysql_real_escape_string($value);

if(strstr($this->fields, $field))
$extfields[$field] = $value;
else
$stdfields[$field] = $value;
}

//Build the 2 queries -- Maybe there is a better way to do this?
$extfieldcount = count($extfields);
$stdfieldcount = count($stdfields);
$stditers = 0;
$extiters = 0;

foreach($extfields as $field => $value)
{
if($extiters != $extfieldcount)
{
$extfields.= $field.", ";
$extvalues.= "'".$value."', ";
}
else
{
$extfields.= $field." ";
$extvalues.= "'".$value."' ";
}
$extiters++;
}

foreach($stdfields as $field => $value)
{
if($stditers != $stdfieldcount)
{
$newfields.= $field.", ";
$newvalues.= "'".$value."', ";
}
else
{
$newfields.= $field." ";
$newvalues.= "'".$value."' ";
}
$stditers++;
}

//Inset the standard fields
$stdquery = "INSERT INTO masteridx (".$newfields.") VALUES (".$newvalues.")";
$this->dbQuery($stdquery);

/* not perfect. I need a better way to find the id that was inserted, so I can combine three queries into at least two */

$findlastquery = "SELECT `id` FROM `masteridx` WHERE `slug`='".$fields['slug']."' LIMIT 1";
$result = $this->dbQuery($findlastquery);
$result = mysql_fetch_assoc($result);
$tempfield = "id, ";
$tempvalue = "'".$result['id']."', ";

//Insert the extra fields
$extquery = "INSERT INTO ".$this->type." (".$tempfield.$extfields.") VALUES (".$tempvalue.$extvalues.")";
$this->dbQuery($extquery);

}

所以对于准备好的语句,我不能绑定(bind)字段,只能绑定(bind)值,对吗?所以如果我做了类似的事情,我仍然必须逃离这些领域:

for ($i = 0; $i <= $stdfieldcount; $i++)
{
if($i < $stdfieldcount)
$qs.= '?, ';
else
$qs.= '? ';
}

$sth = $dbh->prepare("INSERT INTO masteridx ({$stdfields}) VALUES ({$qs})");
$sth->execute($array_of_stdfield_values);

如果我仍然必须逃离这些领域,那么这里有什么意义呢?该函数最终将获取包含多篇文章及其字段的数组。每次字段本身也会不同。我认为当我第一次查看准备好的语句时,我可以只将一个字段数组和一个值数组传递给它,但我想情况并非如此。

我的问题是,你们将如何实现这一目标?我想开始成为数据库不可知论者,而 PDO 看起来是实现这一目标的好方法。

最佳答案

PHP 提供了很多方便的函数,可以完成您手动执行的许多操作。

  • PDO 在您的 SQL 语句中支持命名参数,因此您可以传递一个键/值数组,其中的键与您的命名参数占位符相匹配。
  • join()函数对于构建逗号分隔列表非常有用。
  • 存在许多操作 arrays 的函数.
  • 一些函数允许你给出 callback (在 PHP 5.3 中可以是闭包),动态处理数组。

示例(未测试):

function insertFields($fields) {
$columns = join(",", array_map(
function($col) { return "`".preg_replace("/`/gu","``",$col)."`"},
array_keys($fields)));

$params = join(",", array_map(
function($col) { return ":".preg_replace("/[`\s]/gu","",$col)},
array_keys($fields)));

$stdquery = "INSERT INTO masteridx ({$columns}) VALUES ({$params})";
$stmt = $pdo->prepare($stdQuery);
$stmt->execute($fields);
}

关于php - mysql_query 到 PDO 和准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com