请在回答或按“关闭”链接前仔细阅读此问题。
这个问题是关于分享经验,交换提示和技巧。
您使用什么代码将数据插入mysql数据库?
只需从您的真实项目中获取一些代码。最好是CRUD型 我的意思是真正的代码。 请不要手动复制粘贴代码示例。它与现实生活需求不同。请不要回答“你可以使用这些方法......”。我完全了解他们。我要求的不是方法,而是要求真正的编码经验。
我发现分享您的代码,向他人学习经验非常有趣且非常有启发性。
请注意,代码必须完整,包括所有数据准备工作。但如果可能,不进行验证。如果有太多的后台工作(如模型初始化等),可以省略后台工作。我要求更多的是为了思考食物而不是复制和粘贴代码。
请不要太快关闭此主题 我渴望得到真实世界的代码示例,这里只有很少的代码,但虚拟代码片段无处不在。
欢迎使用PHP以外的语言,以及任何ORM或框架用法。但请记住 - 不要从文档示例中复制粘贴,而是从您自己的项目中复制粘贴。有很大的不同。
答案 0 :(得分:2)
有Redbean ORM。我所做的基本上是围绕它的域对象包装我自己的代码,因此它看起来像
class Book extends RedBean_DomainObject
{
public function __construct($id)
{
if ($id!=0)
$this->find($id);
}
public function save_details($author, $title)
{
// insert OR update new entry
$this->author = $author;
$this->title = $title;
$this->save();
}
}
代码将检查'bean'是否存在;如果是的话,它会加载它。您将属性分配给该类,并调用save()方法将其保存到该bean。 RedBean ORM将自动检测它是保存还是更新。 注意:但RedBean域对象已被更好的东西取代。
我也在使用WordPress wp-db,我喜欢语法
$wpdb->insert("books", array('title' => $title, 'author' =>$author));
我找到了一个little wrapper online,它允许我执行INSERT ...在DUPLICATE KEY上。
$wpdb->insert_on_duplicate("author_book_relationship",
array('book_id' => $book_id,
'date_published' =>$date_published),
array('book_id' => $book_id));
第一个参数是表,第二个是插入/更新信息,最后一个是UPDATE部分的where子句。
修改强>
我通常将SQL函数包装在帮助器中
class BookHelper
{
public function save_relationship($id, $book, $author)
{
global $wpdb;
$wpdb->insert_on_duplicate("author_book_relationship",
array('book_id' => $book_id,
'date_published' =>$date_published),
array('book_id' => $book_id));
}
}
并且在策略中
class BookSaveStrategy
{
protected $book_helper;
public function save_relationship($id, $book, $title)
{
// validate id, book and title
//.....
// Save if ok
$this->book_helper->save_relationship($id, $book, $title);
}
}
可以在控制器中使用
if (isset($_POST['save_book']))
{
$book_save_strategy->save($_POST['id'], $_POST['author'], $_POST['title']);
}
答案 1 :(得分:2)
我的框架的ORM:
$User = new User();
$User->name = 'John';
$User->email = 'john@example.com';
$User->homepage = 'http://example.com';
$User->save();
保持简单,轻便,有效。
答案 2 :(得分:1)
以下是我的一个脚本中的示例:
$fields=array('city','region');
if ($id=intval($_POST['id'])) {
$query="UPDATE $table SET ".dbSet($fields)." WHERE id=$id";
} else {
$query="INSERT INTO $table SET ".dbSet($fields);
}
dbget(0,$query);
dbSet()
是一个辅助函数,用于从$ _POST数组生成SQL SET语句,数组包含字段名,使用一个使表单字段名称等于表字段名称的注释。
dbget()
是一个运行查询的函数,0表示原始类型的返回值,以防在进一步的代码中需要它。
答案 3 :(得分:1)
使用ADOdb:
$stmt = $db->Prepare("INSERT INTO `table` (`column1`, `column2`, `column3`) VALUES (?, ? ,?)");
$insert = $db->Execute($stmt, array($value1, $value2, $value3));
if($insert === false) throw new Exception($db->ErrorMsg());
答案 4 :(得分:0)
public static function insertSQL($table, $fields, $values)
{
if (self::$_databaseLogger == null) { self::$_databaseLogger = &LoggerManager::getLogger('databaseAccess'); }
$fieldCount = count($fields);
$valueCount = count($values);
if ($fieldCount != $valueCount) {
self::$_databaseLogger->error('database.insertSQL() Error: field list is different size to value list');
throw new Exception("Database::insertSQL field list is different size to value list");
} else {
$sql = 'INSERT INTO '.$table.' ('.implode(', ',$fields).') VALUES ('.implode(', ', $values).')';
self::$_databaseLogger->databaseQuery('database.insertSQL(): '.$sql);
$statement = database::getDBConnection()->prepare($sql);
$insertedRows = $statement->execute();
if ($insertedRows === False) {
self::$_databaseLogger->error('database.insertSQL(): insertSQL ERROR');
throw new Exception('database::insertSQL ERROR');
}
self::$_databaseLogger->databaseResult('database.insertSQL(): Inserted '.$insertedRows.' rows');
return $insertedRows;
}
} // function insertSQL()
所有数据值都经过验证,在适用于字符串的地方引用并在调用insertSQL()方法之前进行转义。使用的记录器是log4PHP。
修改强>
用例:
$fileTreeTableFieldsArray = array ( 'FILE_ID',
'FILE_TYPE',
'FILE_NAME',
'FILE_PARENT_ID',
'FILESIZE',
'CREATED_BY',
'CREATED_ON',
'APPLICATION_CONTEXT' );
$fileTreeTableValuesArray = array ( database::getSQLValueString($this->_fileID,'int'),
database::getSQLValueString($fileType,'text'),
database::getSQLValueString($name,'text'),
database::getSQLValueString($parentID,'int'),
database::getSQLValueString($fileSize,'int'),
database::getSQLValueString($_SESSION["USERID"],'int'),
database::getSQLValueString('sysdate','datetime'),
database::getSQLValueString($_SESSION["APPLICATION"],'int') );
Database::startTransaction();
try {
$result = database::insertSQL('RCD_FILE_TREE',
$fileTreeTableFieldsArray,
$fileTreeTableValuesArray);
} catch (Exception $e) {
Database::rollback();
$error = $this->_setError(baseFileClassInsertException, $this->_fileCategory, $this->_fileName, $sql, $e->getMessage());
$this->_logger->error($this->_ErrorMessage);
return $error;
}
Database::commitTransaction();
答案 5 :(得分:0)
以下是我们公司框架中的一些示例。
原始查询:
Db::query(
"UPDATE sometable SET city = %s, region = %s WHERE id = %d",
$city, $region, $id);
// or
Db::query(
"UPDATE sometable SET city = %(city)s, region = %(region)s WHERE id = %(id)d",
array('city' => $city, 'region' => $region, 'id' => $id));
支持多个占位符,例如%s
(字符串),%d
(整数),%f
(浮点),%?
(自动检测类型)参数),%-
(无转义,按原样插入),甚至%as
,%ad
等(字符串/整数/数组,用逗号分隔值替换)。一切都在场景后面妥善逃脱。
还有某种ORM功能非常有限:
$city = !empty($id) ? City::fetchOneById($id) : City::create();
$city->setValues(array('city' => $city, 'region' => $region));
$city->save();
答案 6 :(得分:0)
从最近项目的模型中获取的函数(使用Codeigniter)。它已经习惯了 在日历和跟踪表中插入一段假期 变化(减去假期,加上每个月增加的系统)。
DateIterator
是一个自定义迭代器,它以格式返回连续的日期
yyyy-mm-dd
,work_days
是一个自定义帮助器,可以计算 - 的数量
两个提供日期之间的工作日。为意大利变量名称道歉。
function richiesta_ferie($utente, $inizio, $fine) {
// INSERT INTO Ferie
$data = array(
'ID_Utente' => $utente,
'Richiesta' => date('Y-m-d H:i:s'),
'Inizio' => $inizio,
'Fine' => $fine,
'Stato' => 'P',
);
$this->db->insert('Ferie', $data);
$ID_Ferie = $this->db->insert_id();
// INSERT INTO Variazione
$work_days = -1 * work_days($inizio, $fine);
$data = array(
'ID_Richiesta' => $ID_Ferie,
'ID_Utente' => $utente,
'Giorni' => $work_days,
);
$this->db->insert('Variazione', $data);
// INSERT INTO Giorno
// DateIterator defined in helpers/MY_date_helper.php
$DateIterator = new DateIterator($inizio, $fine);
foreach ( $DateIterator as $date ) {
// skip sundays
if ( date('w', strtotime($date)) == 0 ) {
continue;
}
$data = array(
'ID_Utente' => $utente,
'ID_Richiesta' => $ID_Ferie,
'TipoRichiesta' => 'F',
'Giorno' => $date,
'Stato' => 'P',
);
$this->db->insert('Giorno', $data);
}
}
答案 7 :(得分:0)
try {
$pSt = $dbh->prepare('INSERT INTO voucher (field1, field2, field3) VALUES (:field1, :field2,:field3)');
$pSt->execute(array(':field1'=>$field1, ':field2' =>$field2,':field3'=>$field3));
$status=$pSt->errorCode();
if($status=='00000'){
echo "Voucher $voucher created successfully.";
}else{
$error=$pSt->errorInfo();
echo $error[2];
}
} catch (Exception $e) {
echo "Failed: " . $e->getMessage();
}
更改了字段名称。否则这是我使用的代码。