我有一个带有边框的表,在CSS中设置为"none".但是,我想在表格上放一条水平线来分隔每一行.我曾尝试<hr>在<td> </td>特定行的每个标记之间放置标记,但它会打印一条水平黑线,每列之间有一些小的空格.
有没有办法使用不同的方法在表格中打印水平线?
前段时间我写了一个随机字符串生成器,它使用字符串中的mt_rand()字符构建一个字符串,直到达到所需的长度.
public function getPassword ()
{
if ($this -> password == '')
{
$pw = '';
$charListEnd = strlen (static::CHARLIST) - 1;
for ($loops = mt_rand ($this -> min, $this -> max); $loops > 0; $loops--)
{
$pw .= substr (static::CHARLIST, mt_rand (0, $charListEnd), 1);
}
$this -> password = $pw;
}
return $this -> password;
}
Run Code Online (Sandbox Code Playgroud)
(CHARLIST是一个类常量,包含密码的字符池.$ min和$ max是长度约束)
今天,当我完全研究其他东西时,我偶然发现了以下代码:
function generateRandomString ($length = 10) {
return substr(str_shuffle ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
}
Run Code Online (Sandbox Code Playgroud)
这与我在一行中基于循环mt_rand()的代码实现了几乎相同的效果.我非常喜欢它,原因很简单,更少的代码行总是好事.:)
但是当我在PHP的手册中查找str_shuffle时,它的文档很轻松.我真正热衷于学习的一件事是它用于随机性的算法是什么?手册没有提到为获得混洗字符串做了什么样的随机化.如果它使用rand()而不是mt_rand()那么坚持我当前的解决方案可能会更好.
所以基本上我想知道str_shuffle如何随机化字符串.它是使用rand()还是mt_rand()?我正在使用我的随机字符串函数来生成密码,因此随机性的质量很重要.
更新:正如已经指出的那样,str_shuffle方法不等同于我已经使用的代码,并且由于字符串的字符与输入保持相同而且随着它们的顺序改变而变得不那么随机.但是我仍然对str_shuffle函数如何随机化其输入字符串感到好奇.
我正在构建一个对象数组.我需要这个数组只包含一个给定对象的实例,对同一个对象的多个引用应该抛出异常.我正在使用以下代码来实现此目的:
public function addField ($name, iface\Node $field)
{
// Prevent the same field being added multiple times
if (!in_array ($field, $this -> fields))
{
$this -> fields [$name] = $field;
$field -> setParent ($this);
}
else
{
throw new \InvalidArgumentException ('This field cannot be added to this group');
}
return ($this);
}
Run Code Online (Sandbox Code Playgroud)
当我开始实现实现Node接口的对象时,这开始导致问题,因为它们可以包含循环引用(它们包含其子节点的集合,每个子节点都包含对其父节点的引用).尝试添加字段可能会导致生成以下错误:
PHP致命错误:嵌套级别太深 - 递归依赖?
我怀疑PHP正试图遍历整个对象数组,而不仅仅是比较对象引用,看它们是否保持相同的值,因此指向同一个对象.
我需要in_array做的只是将它存储的对象引用与字段的对象引用进行比较.这将阻止它尝试遍历整个对象树并遇到递归问题.
有办法做到这一点吗?
由于大多数(所有?)进行HTML清理的PHP库(如HTML Purifier)严重依赖于正则表达式,我认为尝试编写使用DOMDocument和相关类的HTML清理程序将是一个值得的实验.虽然我现在处于非常早期的阶段,但到目前为止,该项目显示了一些希望.
我的想法围绕一个类,该类使用DOMDocument遍历提供的标记中的所有节点,将它们与白名单进行比较,并删除不在白名单上的任何内容.(第一个实现是非常基本的,只根据类型删除节点,但我希望能够更加复杂并分析节点的属性,链接是否会在将来对不同域中的项进行寻址等).
我的问题是如何遍历DOM树?据我所知,DOM*对象有一个childNodes属性,所以我需要在整个树上进行递归吗?此外,DOMNodeLists的早期实验表明,您需要非常小心删除的顺序,否则您可能会留下项目或触发异常.
如果有人有使用PHP操作DOM树的经验,我会很感激您对该主题的任何反馈.
编辑:我为我的HTML清理类构建了以下方法.它以递归方式遍历DOM树并检查找到的元素是否在白名单中.如果不是,则将其删除.
我遇到的问题是,如果删除节点,DOMNodeList中所有后续节点的索引都会发生变化.简单地从下到上工作可以避免这个问题.目前它仍然是一种非常基本的方法,但我认为它显示出了希望.它肯定比HTMLPurifier快得多,尽管Purifier做了很多东西.
/**
* Recursivly remove elements from the DOM that aren't whitelisted
* @param DOMNode $elem
* @return array List of elements removed from the DOM
* @throws Exception If removal of a node failed than an exception is thrown
*/
private function cleanNodes (DOMNode $elem)
{
$removed = array ();
if (in_array ($elem -> nodeName, $this -> whiteList))
{
if ($elem -> hasChildNodes ())
{
/*
* Iterate over the element's children. …Run Code Online (Sandbox Code Playgroud) PHP 5.5正在添加对finallytry/catch块的支持.
Java允许您创建一个没有catch块的try/catch/finally块,因此您可以在发生异常时在本地进行清理,但让异常本身在调用堆栈中向上传播,以便可以单独处理它.
try {
// Do something that might throw an exception here
} finally {
// Do cleanup and let the exception propagate
}
Run Code Online (Sandbox Code Playgroud)
在当前版本的PHP中,您可以实现一些可以对异常进行清理并让它传播的东西,但是如果没有抛出异常,则永远不会调用清理代码.
try {
// Do something that might throw an exception here
} catch (Exception $e) {
// Do cleanup and rethrow
throw $e;
}
Run Code Online (Sandbox Code Playgroud)
PHP 5.5是否支持try/finally风格?我已经找到了相关的信息,但是我能从PHP.net找到最接近答案的答案,只是暗示它没有.
在PHP 5.5及更高版本中,也可以在catch块之后指定finally块.finally块中的代码将始终在try和catch块之后执行,无论是否抛出异常,并且在正常执行恢复之前.
措辞表明你总是被期望有一个陷阱,但就我所见,它并没有完全说出来.
我正在构建一个扩展include_path的自动加载器.它需要一个数组,附加explode()d include路径,删除对当前目录的所有引用,在数组的开头添加一个当前目录,最后将整个join()连接在一起以形成一个新的包含路径.代码如下所示
<?php
static public function extendIncludePath (array $paths)
{
// Build a list of the current and new paths
$pathList = array_merge (explode (PATH_SEPARATOR, $paths), explode (PATH_SEPARATOR, get_include_path ()));
// Remove any references to the current directory from the path list
while ($key = array_search ('.', $pathList))
{
unset ($pathList [$key]);
}
// Put a current directory reference to the front of the path
array_unshift ($pathList, '.');
// Generate the new path list
$newPath = implode (PATH_SEPARATOR, $pathList);
if …Run Code Online (Sandbox Code Playgroud) 到目前为止我对PDO的理解是PDO将尽可能使用真实的预处理语句,并在不可能的地方模拟它们.我也明白,在涉及mysql的地方,如果你正在使用支持它们的mysql版本进行通信,那么将使用真正准备好的语句.
事实上,MySQL PDO驱动程序的PHP手册页也是如此. http://php.net/manual/en/ref.pdo-mysql.php
但是,在另一个SO问题上,我正在帮助解决 如何用数组中的元素替换所有出现的char?有人发表评论称这不是真的,事实上PDO在与MySQL数据库交谈时模仿准备好的语句.
我没有太多运气找到证据支持那里的声明,但我确实发现有一个PDO :: ATTR_EMULATE_PREPARES属性可以配置为切换准备好的语句仿真.
那么事情的真相是什么?PDO真的不使用mysql准备好的语句吗?如果没有,可以强迫它这样做,如果是的话,你应该这样做吗?我一直认为,正如手册中所声称的那样,mysql具有PDO将使用它们的真实预处理语句.手册不准确吗?
编辑添加:我最近阅读了一些文章,至少给出了一个合理的理由,为什么默认情况下禁用真正准备好的查询.PHP脚本往往是短暂的,只运行足够长的时间来生成对请求的响应,之后所有资源都被释放.对于任何查询,您只需执行一次请求,您实际上必须执行2个SQL命令(prepare命令和执行命令),因此对于任何只执行一次的预准备语句,您实际上可能会获得比模拟更差的性能准备好的声明 对于必须在循环中运行的查询,实际准备好的语句可能会表现得更好,但这种情况在PHP通常用于的请求/响应模型中相对较少.
我仍然认为真正准备好的语句是可取的,但至少我有一个合理的解释,为什么PDO默认使用模拟查询.
我正在尝试使用vfsStream来模拟文件系统操作(实际上是从php://输入读取),但缺乏体面的文档和示例实际上是在妨碍我.
我正在测试的类中的相关代码如下:
class RequestBody implements iface\request\RequestBody
{
const
REQ_PATH = 'php://input',
protected
$requestHandle = false;
/**
* Obtain a handle to the request body
*
* @return resource a file pointer resource on success, or <b>FALSE</b> on error.
*/
protected function getHandle ()
{
if (empty ($this -> requestHandle))
{
$this -> requestHandle = fopen (static::REQ_PATH, 'rb');
}
return $this -> requestHandle;
}
}
Run Code Online (Sandbox Code Playgroud)
我在PHPUnit测试中使用的设置如下:
protected function configureMock ()
{
$mock = $this -> getMockBuilder ('\gordian\reefknot\http\request\RequestBody');
$mock -> setConstructorArgs (array …Run Code Online (Sandbox Code Playgroud) 我正在为可排序的表编写代码,其中单击标题中的链接会更改生成一组搜索结果时执行的ORDER BY(如果没有有效的顺序,则导致查询不按顺序运行然后按照数据库返回的顺序返回结果.这是设计的).代码是在我的雇主提供的框架内编写的.
要验证查询的ORDER BY部分,我通过以下验证函数运行输入.
<?php
function sortMode ($name)
{
$mode = '';
switch ($name)
{
case 'resnum' : $mode = 'b_resnum'; break;
case 'state' : $mode = 'st_id'; break;
case 'name' : $mode = 'lastname, firstname'; break;
case 'phone' : $mode = 'phone'; break;
case 'email' : $mode = 'email'; break;
case 'opened' : $mode = 'cs_created'; break;
default : $mode = ''; break;
}
return ($mode);
}
?>
Run Code Online (Sandbox Code Playgroud)
在测试中,我发现如果没有提供参数,那么排序顺序将是resnum.经过一些实验,我发现框架中内置的过滤会导致请求未初始化的变量(如未设置的GET参数)返回整数0.如果上面的代码被输入一个0整数作为其输入,它将始终跟随第一个可用的执行路径.
作为一个实验,我尝试在switch语句中重新排列case的顺序,并发现如果该函数传递0,那么顶部的任何内容都将被执行.
该问题的解决方案是使用switch (strval($name))所以特定问题得到解决,但现在我很好奇PHP开关语句的一般行为.我亲眼目睹了PHP的正确行为吗?PHP中是否存在导致此问题的错误,或者我在我不知道的代码中出错?
我想在我的MySQL测试数据库上创建两个用户,一个用户可以对与生成报告相关的表进行只读访问等,另一个用户可以对同一个表进行读写访问.这用于测试通常与只读用户连接的子系统,但是为某些任务切换到读写用户.我已经使用正确的权限创建了读写用户,现在我需要同一用户的只读版本.
我不想从头开始创建只读版本,因为我必须设置很多权限,这是相当费力的.有没有办法可以根据现有用户创建新用户,然后从新用户中删除INSERT/UPDATE/DELETE权限?有类似CREATE USER 'user2' LIKE 'user1'或类似的东西?如果可以做到这一点,我在MySQL文档中找不到它.