您用于将数据插入mysql数据库的代码

时间:2010-09-23 09:18:06

标签: php mysql

请在回答或按“关闭”链接前仔细阅读此问题。
这个问题是关于分享经验,交换提示和技巧。

您使用什么代码将数据插入mysql数据库?

只需从您的真实项目中获取一些代码。最好是CRUD型 我的意思是真正的代码。 请不要手动复制粘贴代码示例。它与现实生活需求不同。请不要回答“你可以使用这些方法......”。我完全了解他们。我要求的不是方法,而是要求真正的编码经验。

我发现分享您的代码,向他人学习经验非常有趣且非常有启发性。

请注意,代码必须完整,包括所有数据准备工作。但如果可能,不进行验证。如果有太多的后台工作(如模型初始化等),可以省略后台工作。我要求更多的是为了思考食物而不是复制和粘贴代码。

请不要太快关闭此主题 我渴望得到真实世界的代码示例,这里只有很少的代码,但虚拟代码片段无处不在。

欢迎使用PHP以外的语言,以及任何ORM或框架用法。但请记住 - 不要从文档示例中复制粘贴,而是从您自己的项目中复制粘贴。有很大的不同。

8 个答案:

答案 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-ddwork_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();
}

更改了字段名称。否则这是我使用的代码。