Home>Q&A>body text

php - 请问字符串如何在SQL语句中自动加单引号……

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 语句?

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

PHP中文网PHP中文网 2714 days ago 1048

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-11 08:59:25

    $keys = join(',', array_keys($array)); // 获取值 $values = "'" . join("','", array_values($array)) . "'"; $sql = "INSERT into {$table}($keys) VALUES({$values})";

    reply
    0
  • 怪我咯

    怪我咯2017-04-11 08:59:25

    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); } }

    reply
    0
  • Cancelreply