我有一个简单的HTML上传表单,我想指定一个默认扩展名(例如"*.drp").我已经读过这样做的方法是通过输入标签的ACCEPT属性,但我不知道具体如何.
<form enctype="multipart/form-data" action="uploader.php" method="POST">
Upload DRP File:
<input name="Upload Saved Replay" type="file" accept="*.drp"/><br />
<input type="submit" value="Upload File" />
</form>
Run Code Online (Sandbox Code Playgroud)
编辑 我知道使用javascript可以验证,但我希望用户只在他的弹出对话框中看到".drp"文件.此外,我不太关心此应用程序中的服务器端验证.
我正在使用Yii框架开发PHP/MySQL应用程序.
我遇到过以下情况:
在我VideoController,我有一个actionCreate创建一个新的视频,actionPrivacy 并设置视频的隐私.问题是在调用模型actionCreate的setPrivacy方法期间Video,当前有一个事务.我希望视频的创建也在事务中,这会导致错误,因为事务已经处于活动状态.
在对这个答案的评论中,比尔卡文写道
因此,不需要使Domain Model类或DAO类管理事务 - 只需在Controller级别执行即可
在这个答案中:
由于您使用的是PHP,因此您的交易范围最多只是一个请求.所以你应该只使用容器管理的事务,而不是服务层transa.也就是说,在处理请求开始时启动事务,并在完成处理请求时提交(或回滚).
如果我管理控制器中的事务,我会有一堆看起来像这样的代码:
public function actionCreate() {
$trans = Yii::app()->getDb()->beginTransaction();
...action code...
$trans->commit();
}
Run Code Online (Sandbox Code Playgroud)
这导致我需要事务处理的许多地方重复代码.
或者我可以将它重构为父类的beforeAction()和afterAction()方法,Controller然后父类会自动为正在执行的每个操作创建事务.
这种方法会有问题吗?PHP应用程序的事务管理有什么好的做法?
我有两个复杂的PHP对象,每个对象都有几个MySQL表中的数据.
有时,我只需要从数据库中删除一个对象A,这需要3个SQL语句.
有时,我需要从数据库中删除一个对象B,这需要4个SQL语句,并且还需要查找和删除对象B拥有的所有对象A.
所以在函数delete_A()中,我在一个事务中执行那些语句.在delete_B()函数内部,我想运行一个覆盖delete_A()内部活动的大型事务.如果删除B的整个原子都失败了,我需要在回滚中恢复它的所有A.
如果尚未运行更大的事务,如何更新delete_A()的定义以仅打开新事务.
我希望能够做这样的事情,但该autocommit属性似乎没有被改变beginTransaction()
function delete_A($a){
global $pdo;
$already_in_transaction = !$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
if(!$already_in_transaction){
$pdo->beginTransaction();
}
//Delete the A
if(!$already_in_transaction){
$pdo->commit();
}
}
function delete_B($b){
global $pdo;
$pdo->beginTransaction();
foreach($list_of_As as $a){
delete_A($a);
}
$pdo->commit();
}
Run Code Online (Sandbox Code Playgroud) 我们正在使用zend_db_table,因为Zend Framework抱怨两个事务处于活动状态,所以我们遇到了一些问题:
[message:protected] => There is already an active transaction
[string:Exception:private] =>
[code:protected] => 0
[file:protected] => /var/www/vhosts/test.local/private/library/Zend/Db/Adapter/Pdo/Abstract.php
[line:protected] => 305
[trace:Exception:private] => Array
Run Code Online (Sandbox Code Playgroud)
这是Controller中的代码:
public function convertAction()
{
$this->setNoRender();
// If the quote is a copy of a previous one, fetch all the datas
$quoteId = Zend_Filter::filterStatic($this->getRequest()->getParam('qte_id'), 'int');
$quoteTable = new Model_QuotesTable();
$quoteRow = $quoteTable->findById($quoteId);
if (count($quoteRow)) {
$clonedId = $quoteRow->convertToJob();
$this->flashMessageRedirect('Quotation successfully converted', '/jobs/edit/job_id/' . $clonedId);
} else {
$this->flashMessageRedirect('Unable to find the quote to be converted', '/quotes'); …Run Code Online (Sandbox Code Playgroud)