如何在数据库类中创建插入函数以插入具有多个coloumns和多个值的新记录(使用PDO)?

时间:2015-11-13 13:42:54

标签: php mysql pdo

问题是我的函数 insert 将我的记录插入两行。

这是我在一个名为:

的文件中连接数据库的代码

connect.php

my_set = {1, 'hello', 12.4}
print(my_set)

while True:
    try: 
        val = my_set.pop()
        print(val)
    except KeyError:
        print("last: {}".format(val))
        break

--output:--
{1, 12.4, 'hello'}
1
12.4
hello
last: hello

这是我在文件中的数据库类

database.php中

<?php
try{
$db = new PDO("mysql:host=localhost;dbname=NPD" , "root" , "");

echo "connected";
}
catch(Exception $e){
    echo $e->getMessage();
}

数据库中的结果是: tableOne

如何使 insert 函数将我的记录插入一行。

note :我想插入任意数量的列和值。

4 个答案:

答案 0 :(得分:4)

尝试做这样的事情:

$arr = array('name' => 'lolo' , 'deg' => '100');
$columns=array_keys($arr);
$values=array_values($arr);

           $str="INSERT INTO $tableName (".implode(',',$columns).") VALUES ('" . implode("', '", $values) . "' )";
           echo $str;//your sql
         //  $stmt = $db->prepare($str);
         //  $stmt->execute();//uncomment to execute

答案 1 :(得分:1)

像这样,但有一些问题(我还没有测试过)

class DB {

    protected $_conn;

    public function __construct( $user, $pass, $database='NPD', $host='localhost' ){
        try{
            $this->_conn = new PDO("mysql:host={$host};dbname={$database}" , $user , $pass);
            echo "connected";
        }catch(Exception $e){
            echo $e->getMessage();
        }
    }

    public function insertInto($tableName , $info){
            $sql = 'INSERT INTO $tableName (';
            $sql .= '`'implode('`,`', array_keys($info[0])).'`';
            $sql .= ')VALUES';


            foreach ($info as $index => $row) {   
                $sql .= '(';
                foreach( $row as $column => $value){
                    $sql .= ':'.$column.$index.',';
                    $params[':'.$column.$index] = $value;
                }
                $sql = rtrim($sql, ',');
                $sql .= '),';
            }
            $sql = rtrim($sql, ',');

            $stmt = $this->_conn->prepare($sql);
            $stmt->execute($params);   
        }
    }
}
$da = new DB('root', '');
$da->insertInto('tableOne',array( array('name' => 'lolo' , 'deg' => '100') ) );

首先,您对列名称松开了任何sql注入保护。如果你可以管理值上的占位符,那就没问题,但是如果没有使用它们,你也可以放弃对它的保护。这可以通过Show columns使用db模式本身来解决,但这有点复杂。

https://dev.mysql.com/doc/refman/5.7/en/show-columns.html

其次,您的输入数组结构完全错误,需要array(0=>array(...), 1=>array(...))而不是array(...)

第三,我会把这个班级变成“单身人士”,但那只是我

http://coderoncode.com/design-patterns/programming/php/development/2014/01/27/design-patterns-php-singletons.html

第四,如果你只想一次做一行,你可以改变这个方法

 public function insertInto($tableName , $info){
        $sql = 'INSERT INTO $tableName (';
        $sql .= '`'implode('`,`', array_keys($info)).'`';
        $sql .= ')VALUES(';

        $params = array();
        foreach( $info as $column => $value){
            $sql .= ':'.$column.$index.',';
            $params[':'.$column.$index] = $value;
        }
        $sql = rtrim($sql, ',');
        $sql .= ')';

        $stmt = $this->_conn->prepare($sql);
        $stmt->execute($params);   
}

并使用您拥有的当前输入数组结构。

答案 2 :(得分:0)

这是我如何编码自己的插入功能

        public function insertRecord($table,$records){
          //A variable to store all the placeholders for my PDO INSERT values.
            $placeholder = '';
        for ($i = 0; $i < sizeof($records); $i++){
                $placeholder[$i] = '?';
            }
     //A FOR-LOOP to loop through the records in the $record array
            $placeholder = implode(',', $placeholder);
 //Imploding ',' in between the placeholders

            $sql = "INSERT INTO ".$table." VALUES ("{$placeholder}")";
            $query = $this->dbh->prepare($sql);
            $query->execute($records);
          }

它可能不是最好的......但是对我而言。

答案 3 :(得分:0)

正如其他一些答案/评论所述,对整个过程有很多批评。但是,为了简单回答问题,您可能只想通过循环遍历列,然后循环遍历值,然后执行完成的语句来构建语句(下面的代码只是一个示例,并且还没有测试):

require 'connect.php';
class DB {
public function insertInto($tableName , $info){
        global $db;        
        $query = "INSERT INTO $tableName (";
        $columns = array_keys($info);

        // build the columns in the statement
        $length = count($columns);
        foreach($columns as $index => $column) {
            $query .= "$column";
            if ($index+1 < $length) {
                $query .= ','
            }            
        }

        $query .= ") VALUES ("

        // build the values in the statement
        $i = 1;
        $length = count($info);
        foreach($info as $value) {
            $query .= "'$value'"
            if ($i < $length) {
                $query .= ","
            }
            $i++;
        }
        $query .= ")"

        $stmt = $db->prepare($query);
        $stmt->execute();
    }
}
$da = new DB;
$da->insertInto('tableOne',array('name' => 'lolo' , 'deg' => '100'));