编辑:我的主要问题现在变成'如何以一种干净的方式将ServiceManager与教义实体管理器放在我的表单,元素和输入类的手中?' 请继续阅读以查看完整帖子.
我打算试试这里的例子,所以请耐心等待.让我知道我哪里出错/正确或我可以改进的地方
我正在尝试创建一个注册表单.我可以使用ZfcUser模块,但我想自己做.我也在使用带有Doctrine2的ZF2,这让我远离那个模块.
我的策略是,
创建一个名为注册表单的表单类
为每个元素创建单独的"元素"类,其中每个元素都有一个输入规范
由于每个元素都是一个独立的类,我可以单独测试每个元素.
一切似乎都很好,直到我想在我的用户名元素中添加一个验证器,用于检查用户名是否尚未使用.
这是迄今为止的代码
namepsace My\Form;
use Zend\Form\Form,
Zend\Form\Element,
Zend\InputFilter\Input,
Zend\InputFilter\InputFilter,
/**
* Class name : Registration
*/
class Registration
extends Form
{
const USERNAME = 'username';
const EMAIL = 'email';
const PASSWORD = 'password';
const PASS_CONFIRM = 'passwordConfirm';
const GENDER = 'gender';
const CAPTCHA = 'captcha';
const CSRF = 'csrf';
const SUBMIT = 'submit';
private $captcha = 'dumb';
public function prepareForm()
{
$this->setName( 'registration' );
$this->setAttributes( array(
'method' => 'post'
) );
$this->add( …Run Code Online (Sandbox Code Playgroud) 在go中,如何控制对文本文件的并发写入?
我问这个是因为我将使用相同的文件处理程序将多个goroutine写入文本文件.
我写了这段代码试着看看会发生什么,但我不确定我是否"正确"做到了:
package main
import (
"os"
"sync"
"fmt"
"time"
"math/rand"
"math"
)
func WriteToFile( i int, f *os.File, w *sync.WaitGroup ){
//sleep for either 200 or 201 milliseconds
randSleep := int( math.Floor( 200 + ( 2 * rand.Float64() ) ) )
fmt.Printf( "Thread %d waiting %d\n", i, randSleep )
time.Sleep( time.Duration(randSleep) * time.Millisecond )
//write to the file
fmt.Fprintf( f, "Printing out: %d\n", i )
//write to stdout
fmt.Printf( "Printing out: %d\n", i )
w.Done()
}
func main() …Run Code Online (Sandbox Code Playgroud) 这是我的岔路.
我想在我的网页上显示某种按钮,我想在很多地方做这件事.这个"按钮"实际上就像是指向其他页面的链接,所有按钮实例都会转到一个页面.
我希望所有的按钮都是相同的,除了它们的大小.
现在,我应该使用带有html的部分脚本作为按钮并调用部分视图助手进行渲染,还是应该创建一个Zend_View_Helper,当我调用它时会返回按钮的html?
我知道我可以摆动,但你觉得哪个更好?
我看到的一些事情:
帮助器可能更好,因为它不必创建一个BIG对象,如Zend_View的克隆来做部分.
部分脚本对于html人员来说更容易使用.
编辑 我尝试使用 xdebug 和 netbeans 进行调试。奇怪的是,如果我放入一些断点,导出将在调试会话期间工作。然而,在没有断点、更现实的环境的情况下,导出不起作用。
我尝试将睡眠添加到代码的某些部分。
我认为也许 PHP 在 Redis 提交完成之前就结束了。也许Redis连接是异步完成的,但我检查了PRedis,默认是同步连接。
我正在开发一个报告工具。
这是基本问题。
我们将报告存储到会话对象中,但在以后的请求中,当我们尝试访问会话对象中的报告时,它就消失了。
这是更详细的版本。
我将“报告”对象存储到会话中,如下所示
$_SESSION['report_name_unixtimestamp'] = gzcompress( serialize( $reportObject ) );
Run Code Online (Sandbox Code Playgroud)
用户可以看到某种表格形式的报告,然后如果他们愿意,可以将其导出。报告可能会发生变化,因此将其存储在会话中的想法是,当用户将其导出为 PDF、Excel 等时,他们将获得一份与他们正在查看的报告相同的报告。
用户单击导出按钮,在 PHP 端,它将进入会话,通过作为 get 参数提供的密钥获取报告(解压缩和反序列化),创建导出并将其发送给用户下载。
直到我们尝试引入 Redis 缓存服务器作为更好的会话管理工具之前,这种方法一直运行良好。
现在发生的情况如下:
我们第一次运行报告时,它将存储到缓存中,导出将成功。
我们将在同一会话中使用相同的用户帐户再次运行该报告。这会更改 unixtimestamp,因此 .txt 文件中应该有两个条目$_SESSION。($_SESSION['report_name_oldertimetamp']和$_SESSION['report_name_newertimestamp'])。当我们再次单击导出按钮时,我们收到一条错误消息,指出该文件不存在(因为服务器尚未发送该文件)。
如果我们检查 Redis 服务器中是否有较新版本的报告,则该报告不存在,但旧时间戳仍然存在。
现在,这适用于文件会话管理,但不适用于 Redis。我们尝试了 php 的 redis 模块以及纯 php 客户端 Predis。
有人有什么想法吗?
以下是更多细节:
下面是与 Predis 一起使用的保存处理程序。redis_session_init 是我在 session_start() 之前调用的函数,以便它被注册。我不确定 redis_session_write 函数是如何工作的,所以也许有人可以帮助我。
<?php
namespace RedisSession
{ …Run Code Online (Sandbox Code Playgroud) 我在下面有这个简单的程序
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
wg.Add(1)
go func() {
fmt.Println("starting...")
time.Sleep(1 * time.Second)
fmt.Println("done....")
wg.Done()
} ()
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
请注意,我var wg sync.WaitGroup用作值,而不是指针。但是同步包的页面指定Add,Done和Wait函数采用*sync.WaitGroup.
为什么/这是如何工作的?
现在我正在使用Zend Framework并搞乱那个和phpunit.这是我的困境.
当我创建用户时,我在用户表中散列密码.我添加了两种盐,一种来自应用程序的静态盐,另一种是随机生成的.我使用数据库SHA函数,然后使用UNHEX将密码存储在二进制列中.为了告诉数据库如何散列密码,我使用Zend_Db_Expr,如下所示:
protected function _createPasswordDbExpression( $password )
{
$quoted = $this->getDbTable()->getAdapter()->quoteInto( 'UNHEX( SHA1( ? ) )', $password );
$binaryPassword = new Zend_Db_Expr( $quoted );
return $binaryPassword;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直在使用xml数据集来指定预期的结果,但现在,使用散列密码,我不知道该怎么做.
我看到了解决方案,但必须有更好的方法.
我可以预先输入密码或密码,并且只在我的测试期间和我的xml文件中使用它.
还有其他解决方案可能更好,更可测试吗?
当phpunit尝试直接插入"哈希"密码时,我不确切知道这个二进制列会如何影响事情.
我正在创建一个小的LDAP连接类,但这通常适用于PHP常量.
PHP有常量,如LDAP_OPT_PROTOCOL_VERSION,LDAP_OPT_HOST_NAM和LDAP_OPT_TIMELIMIT,用于以下函数:
ldap_set_option ( $myLdapConnection, LDAP_OPT_PROTOCOL_VERSION, 3 )
在我的LDAP连接类中,我希望能够像这样传递数组中的选项
array(
'LDAP_OPT_PROTOCOL_VERSION' => 3,
'LDAP_OPT_TIMELIMIT' => 1000
);
然后我想做以下类型的循环
foreach( $options as $option => $value ){
ldap_set_option ( $myLdapConnection, $option, $value );
}
但是,如果我尝试这个,我会收到一个错误,指出函数需要一个long,而不是一个字符串.我怎么能通过这个?
编辑:Bart是对的,我意识到.我会这样做的.它甚至会更快,因为不会涉及到字符串.
但是要清楚,如果应该有常量重叠,例如当我定义自己的常量时,那么它可能是一个问题.
我有一个关于 Oracle 和检查权限的问题。
我写了一些 php 脚本来“测试”我们环境中的各种东西。其中一项任务是检查用户是否对某个过程具有执行权限以及该过程是否有效/已编译。
这是查询
select ao.object_name, utp.grantee, ao.status, utp.privilege
from all_objects ao, user_tab_privs utp
where utp.owner = ao.owner and
ao.object_name = utp.table_name and
upper( ao.object_name ) = :object_name and
ao.object_type = 'PACKAGE' and
utp.privilege = 'EXECUTE' and
ao.status = 'VALID'
Run Code Online (Sandbox Code Playgroud)
这很有效,并为我们节省了程序特权的时间;我现在意识到我也可以仔细检查 all_tab_privs 以检查执行访问权限。
现在我的问题是,我如何对表格做类似的事情?我们遇到了一个问题,某个用户在表上有 SELECT 权限,但没有 UPDATE/INSERT 权限。我如何单独检查这些权限中的每一个。我查看了 all_tab_privs 但没有发现它显示了我想要的东西。它有我可以执行的过程,但是当我检查是否存在已知表时,它不存在。例如,我将运行以下
select * from all_tab_privs
where table_name = 'KNOWN_TABLE' and
grantee = 'CURRENT_USER'
and privilege in ( 'SELECT', 'UPDATE', 'INSERT' );
Run Code Online (Sandbox Code Playgroud)
但是我没有为表取回 3 行,我知道 100% 我已经可以选择/插入/更新它不返回任何内容。 …
我知道大多数人会对此皱眉头但在我知道PDO语句和转义字符串之前我不确定我应该如何阻止mysql注入.
我创建了一个函数,它接受文本并通过过滤器运行它.我想知道它是否真的会阻止sql注入或者它们是否可以绕过它?我当时的目标是允许用户输入文本并能够在输入时完全显示文本.
除此之外,我还要小心确保用户对数据库的权限不再需要.我是否使用他们的输入来更新或插入新行等.但鉴于我没有,它仍然可以工作?:
function filterInput($textToFilter)
{
if ($textToFilter != null)
{
//a = a
//e = e
//i = i
//o = o
//u = u
//A = A
//E = E
//I = I
//O = O
//U = U
$textToFilter = str_ireplace('insert','insert',$textToFilter);
$textToFilter = str_ireplace('select','select',$textToFilter);
$textToFilter = str_ireplace('values','values',$textToFilter);
$textToFilter = str_ireplace('where','where',$textToFilter);
$textToFilter = str_ireplace('order','order',$textToFilter);
$textToFilter = str_ireplace('into','into',$textToFilter);
$textToFilter = str_ireplace('drop','drop',$textToFilter);
$textToFilter = str_ireplace('delete','delete',$textToFilter);
$textToFilter = str_ireplace('update','update',$textToFilter);
$textToFilter = str_ireplace('set','set',$textToFilter);
$textToFilter = str_ireplace('flush','flush',$textToFilter);
$textToFilter = str_ireplace("'","'",$textToFilter);
$textToFilter = str_ireplace('"',""",$textToFilter); …Run Code Online (Sandbox Code Playgroud)