我尝试为SQL / PDO插入查询创建一个函数:
function InsertQuery ($table,$cols,$values) {
global $pdo_conn;
foreach($values as $values2) {
$values2 = $values2;
}
$stmt='INSERT into $table (';
foreach($cols as $cols2) {
$stmt.=" ".$cols2.", ";
}
$stmt.=" ) VALUES ( ";
foreach($cols as $cols2) {
$stmt.=" :".$cols2." ";
}
$stmt.=" ) ";
$stmt2 = $pdo_conn->prepare($stmt);
foreach($cols as $cols2) {
$stmt2->bindParam(':$cols2', $cols2);
}
}
但我收到错误:
可捕获的致命错误:第30行的/home/integra/public_html/admin/includes/functions.php中无法将类PDOStatement的对象转换为字符串
请耐心等待我,因为我是PDO的新手并且刚刚习惯使用MySQL
我准备好的语句是错误的还是我的foreach循环?
我相信声明应如下:
$stmt2 = $pdo_conn->prepare('INSERT into $table (col1) values (:val1)');
$stmt2->bindParam(':$val1', $val);
这是我如何调用我的函数:
$col=array('col1');
$val=array('val1');
InsertQuery ("table1",$col,$val);
更新
好的,这是我的新代码:
global $pdo_conn;
foreach($values as $values2) {
$values2 = $values2;
}
$stmt='INSERT into '.$table.' (';
foreach($cols as $cols2) {
$stmt.=" ".implode(",", $cols2)." ";
}
$stmt.=" ) VALUES ( ";
foreach($cols as $cols2) {
$stmt.=" :".implode(",", $cols2)." ";
}
$stmt.=" ) ";
$stmt2 = $pdo_conn->prepare($stmt);
foreach($cols as $cols2) {
$stmt2->bindParam(':$cols2', $cols2);
}
但我现在得到关于内爆的错误:
警告:implode()[function.implode]:第18行/home/integra/public_html/admin/includes/functions.php中传递的参数无效
警告:implode()[function.implode]:第22行/home/integra/public_html/admin/includes/functions.php中传递的参数无效
我认为是因为没有什么可以崩溃,因为只有一列和一个值
答案 0 :(得分:2)
使用类型提示确保函数参数是数组:
function InsertQuery ($table, array $cols, array $values) {
确保您的PDO连接可访问。如果它是全局的,你必须声明它(归功于@u_mulder):
global $pdo_conn;
以下什么都不做,摆脱它:
foreach($values as $values2) {
$values2 = $values2;
}
使用内置数组函数而不是预先处理所有内容:
$col_list = implode(",", $cols);
$param_list = implode(",", array_fill(1,count($cols), "?"));
变量不会在单引号内扩展。你需要使用双引号(归功于@MichaelBerkowski)。
另外,对于PDOStatement对象使用$ stmt,而不是对SQL字符串使用。这令人困惑。
$sql="INSERT into $table ($col_list) VALUES ($param_list)";
$stmt = $pdo_conn->prepare($sql);
您不需要在PDO中为bindParam()编写foreach循环。您只需将一组值传递给execute()即可。而且你已经拥有数组中的值,所以它非常简单:
$stmt->execute($values);
}
为了更加安全,请确保分隔列,以防有人在列名中使用特殊字符或SQL关键字:
$col_list = implode(",", array_map(function ($c) { return "`$c`" }, $cols));
确保值是一个简单的数组,而不是一个关联数组:
$stmt->execute(array_values($values));
重新评论:
你能告诉我如何用select做同样的事情,我不知道它是如何工作的,好像我有一个where子句,我将在函数中用它做什么?
例如,可以设计一个带有参数$where
的函数,它是一个关联数组,其键是列名,其值是您要搜索的值。
假设生成的WHERE子句将这些列/值对包含为AND
个术语,并且所有比较都是相等的。
function SelectQuery($table, array $where) {
global $pdo_conn;
$sql = "SELECT * FROM `$table` ";
$values = null;
if ($where) {
$sql .= "WHERE " . implode(" AND ",
array_map(function ($c) { return "`$c` = ?"; } array_keys($where)));
$values = array_values($where);
}
$stmt = $pdo_con->prepare($sql);
$stmt->execute($values);
}
当然,这只支持SELECT中可能包含的一小部分表达式,但我只是在这里展示一种技术。
如果您想要一个更全面的PHP功能查询构建器,请查看Zend_Db_Sql或Doctrine QueryBuilder或Laravel query builder。
如果我的服务器发生任何变化而PDO停止工作,我可以在修复时恢复到MySQL。
PDO自2005年以来一直保持稳定,除非您更改PHP环境并禁用扩展程序或mysql驱动程序,否则它将不会停止工作。
而ext / mysql扩展将停止工作。它目前已被弃用,PHP已宣布将在未来的PHP版本中删除它。
答案 1 :(得分:0)
有一些事情正在发生:
首先,$cols
和$vals
应该是数组,但它们是字符串。
快速修复是使它们成为数组:
$col = array('col1');
$val = array('val1');
InsertQuery("table1", $col, $val);
其次,$pdo_conn
在函数范围内是未知的。使它成为参数或全局。
答案 2 :(得分:0)
您也可以使用它来从数组创建查询:
$myArray = array(
'col1' => 'val1',
'col2' => 'val2'
);
$query = "INSERT INTO table (" . implode(", ", array_keys($myArray)) . ") VALUES (" . implode(", ", $myArray) . ")";
也许对你有用 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers