消息关闭
    暂无新消息!

array_keys() 函数获取数组的键 return array

array_values() 函数获取数组的值 return array

通过 join() 函数可以分割数组成字符串

有如下php代码:

$link = mysqli_connect('localhost', 'root', '123456', 'test');
$array = array(
    "id" => 3,
    "username" => 'aaaaaaa'
);
$table = "t1";
// 获取字段
$keys = join(',', array_keys($array));
// 获取值
$values = join(',', array_values($array));

$sql = "INSERT {$table}($keys) VALUES({$values})";
echo $sql;
$result = mysqli_query($link, $sql);
var_dump($result);
echo mysqli_insert_id($link);

output:

/*
 * output:
 * INSERT t1(id,username) VALUES(3,aaaaaaa)
 * bool(false)
 * 0
 */

数据库结构如下:

mysql> DESC t1;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(50) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

这样是插入不了数据库的,因为正确的SQL语句应该是:

INSERT t1(id,username) VALUES(3,'aaaaaaa');

INSERT t1(id,username) VALUES(3,aaaaaaa) (这个 SQL insert 不进去)

请问:用以上的代码怎么只修改 $sql = "INSERT {$table}($keys) VALUES({$values})"; 可以得到正确的 sql 语句?

如果有更简单的方法,还望不吝赐教,谢谢


2个回答

︿ 0
$keys = join(',', array_keys($array));
// 获取值
$values = "'" . join("','", array_values($array)) . "'";

$sql = "INSERT into {$table}($keys) VALUES({$values})";
︿ 0
  1. 先获取表的结构:describe table

  2. 提取出 字段名 + 字段类型 ,保存在数组中array('field_name'=>'field_type')

  3. 传入数据,然后匹配字段名,根据匹配到的字段名,获取字段类型。

  4. 根据字段类型决定是否要添加 引号

  5. 拼接sql语句

  6. 执行sql

// 调用函数
function M($tb_name = ''){
    return new Db($tb_name);
}

// DB类
class Db {
    static private $_connect = null; // 数据库连接实例,这边用的是 PDO
    private $_tbName = '';
    
    // 设置表名
    public function __construct($tb_name = ''){
        $this->_tbName = $tb_name;
    }
    
    // 执行sql语句
    public function query($sql = ''){
        return self::$_connect->query($sql);
    }
    
    // 获取所有记录
    public function getAll($sql = ''){
        $query = $this->query($sql);
        $data  = $query->fetchAll(PDO::FETCH_ASSOC);
        
        return $data;
    }
    
    // 获取字段结构
    public function getConstructure(){
        // 获取表结构
        $sql  = 'describe ' . $this->tbName;
        $data = $this->getAll($sql);
        $constructure = array();
        
        foreach ($data as $v)
            {
                $constructure[$v['Field']] = $this->getType($v['Type']);
            }
        
        return $constructure;
    }
    
    // 获取具体数据类型
    public function getType($type = ''){
        if (preg_match("/tinyint/" , $type) === 1) {
            return 'tinyint';
        }

        if (preg_match("/int/" , $type) === 1) {
            return 'int';
        } 
        
        if (preg_match("/char/" , $type) === 1) {
            return 'char';
        }
        
        if (preg_match("/varchar/" , $type) === 1) {
            return 'varchar';
        }
        
        if (preg_match("/text/" , $type) === 1) {
            return 'text';
        }
        // 数据库类型不止以上这些,其他的请自行补充
        ...
    }
    
    // 格式化值:也就是自动决定是否给值加 引号
    public function format($key = '' , $val = ''){
        $c = $this->getConstructure();
        
        // 等等之类,其他的请自行补充
        $add_quote_type_range = array('char' , 'varchar' , 'text');
        
        foreach ($c as $k => $v)
            {
                if ($k === $key) {
                    foreach ($add_quote_type_range as $v1)
                        {
                            if ($key === $v1){
                                return "'" . $val . "'";
                            }
                        }
                    
                    return $val;
                }
            } 
        
        return false;
    }
    
    // 保存数据
    public function save(array $data = array()){
        // 数据库所有字段名称
        $fields = array_keys($data);
        
        foreach ($data as $k => $v)
            {
                $data[$k] = $this->format($k , $v);
            }
            
        $vals = array_values($data);
        
        $sql = 'insert into ' . $this->tbName . '(' . $fields . ') values (' . join(' , ' , $vals) . ');
        
        $this->query($sql);
    }
}