问题是我的函数 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 :我想插入任意数量的列和值。
答案 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(...)
第三,我会把这个班级变成“单身人士”,但那只是我
第四,如果你只想一次做一行,你可以改变这个方法
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'));