为PDO插入查询创建PHP函数

时间:2014-01-01 18:31:29

标签: php mysql sql pdo

我尝试为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中传递的参数无效

我认为是因为没有什么可以崩溃,因为只有一列和一个值

3 个答案:

答案 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_SqlDoctrine QueryBuilderLaravel 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