小编Pet*_*ler的帖子

在PHP中解析多字节字符串

我想编写一个基于状态机的(HTML)解析器,但我怀疑如何实际读取/使用输入.我决定将整个输入加载到一个字符串中,然后像使用数组一样处理它并将其索引保持为当前解析位置.

单字节编码没有问题,但在多字节编码中,每个值不代表字符,而是字符的字节.

例:

$mb_string = 'žš??'; //4 multi-byte characters in UTF-8

for($i=0; $i < 4; $i++)
{
   echo $mb_string[$i], PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

输出:

?
ž
?
?
Run Code Online (Sandbox Code Playgroud)

这意味着我不能在循环中遍历字符串以检查单个字符,因为我永远不知道我是否在角色的中间.

所以问题是:

  • 如何以性能友好的方式从字符串中读取单个字符的多字节安全性?
  • 在这种情况下,使用字符串是一个好主意,因为它是一个数组吗?
  • 你会如何阅读输入?

php string parsing multibyte

6
推荐指数
1
解决办法
5190
查看次数

为什么教义使用WHERE IN而不是LIMIT?

为什么学说(1.2)使用WHERE IN而不是LIMIT

这段代码:

Doctrine_Query::create()
   ->from('Table t')
   ->limit(10)
   ->getSqlQuery();
Run Code Online (Sandbox Code Playgroud)

返回如下内容:

SELECT t.id_table AS t__id_table FROM table AS t WHERE t__id_table IN (1,2,3,4,10,12,18,20,21,25);
Run Code Online (Sandbox Code Playgroud)

而不是这个:

SELECT t.id_table AS t__id_table FROM table AS t LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

任何LIMIT值的这种行为都是相同的.这会为高LIMIT值生成非常长的查询.

奖金问题:Doctrine如何知道,使用什么ID?(通过向DB发送另一个查询??)

php doctrine doctrine-1.2

6
推荐指数
1
解决办法
2217
查看次数

连接表性能的ORDER BY列

我有1:1关系的2个表(但将来可能会变成1:N关系),如下所示:

CREATE TABLE article (
   article_id INT,
   inserted DATETIME
) ENGINE InnoDB;

CREATE TABLE article_top (
   article_top_id INT,
   article_id INT,
   until DATETIME
) ENGINE InnoDB;
Run Code Online (Sandbox Code Playgroud)

我需要做的是选择文章依据;通过article_top.until DESC和之后article.inserted DESC(因此,“顶”的文章都在上面,其余的从最新分类到最旧)。

我执行以下查询,这很慢(当我跳过article_top.untilORDER BY子句中的时很快):

SELECT * FROM article 
LEFT JOIN article_top
ON article.article_id = article_top.article_id 
ORDER BY article_top.until DESC, article.inserted DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)

除了将两个表合并为一个表(丢失1:N关系的可能性)之外,我还可以做一些优化查询的事情吗?

我正在考虑向表中添加其他列,article并使用触发器对其进行更新。这样,我可以将索引添加到两个列中,并且排序应该更快。

还有其他方法可以优化查询吗?

谢谢

mysql sql database performance

5
推荐指数
1
解决办法
2315
查看次数

Doctrine:按别名命名,列名相同

我有以下DQL(Doctrine1.2):

$dql->select('sum(t.column1) column1, t.column2')
    ->from('Table t')
    ->groupBy('t.column2')
    ->orderBy('column1');
Run Code Online (Sandbox Code Playgroud)

但生成的SQL与以下DQL相同:

$dql->select('sum(t.column1) column1, t.column2')
    ->from('Table t')
    ->groupBy('t.column2')
    ->orderBy('t.column1'); //Ordered by column1 not by sum(t.column1)
Run Code Online (Sandbox Code Playgroud)

是否可以强制Doctrine使用别名column1而不是列名t.column1

我需要这个,因为我想从两个非常相似的DQL的模型中获得相同的输出格式.(最近由同一模板呈现).另一个DQL看起来像这样:

$dql->select('t.column1, t.column2')
    ->from('Table t')
    ->orderBy('t.column1');
Run Code Online (Sandbox Code Playgroud)

可能的解决方法是选择sum(t.column1)两次.首先使用别名column1,第二次使用其他别名,为什么在passwd之后使用orderBy函数,但它看起来不是最清晰的解决方案.

有什么建议?

谢谢

php mysql doctrine doctrine-1.2

4
推荐指数
1
解决办法
2267
查看次数

为什么for-in也会遍历数组方法?

在页面上我使用类似的语法google analitycs代码,将参数传递给另一个脚本.我遍历数组并尝试根据包含的脚本中的参数构造URL的查询部分.

问题是以下迭代通过javascript数组对象方法也搞乱了结果queryString.

index.html的:

<script>
    var params = [];
    params['first'] = '1';
    params['second'] = '2';

    (function() {
          var vs = document.createElement('script');
          vs.async = true; vs.type = 'text/javascript';
          vs.src = 'http://my.domain.com/js/includedScript.js';
          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(vs, s);
    })();
</script>
Run Code Online (Sandbox Code Playgroud)

includedScript.js:

function(paramsArray) {
   tmpArray = [];
   for(i in paramsArray) {
      tmpArray.push(i + '=' + escape(paramsArray[i]));
   }
   var queryString = tmpArray.join('&');
}(params);
Run Code Online (Sandbox Code Playgroud)

我得到了(缩短):

queryString == 'first=1&second=2&push&$family=function%20%28%29%20%7B%0A%20%20%20%20return%20lower%3B%0A%7D&$constructor=function%20Array%28%29%20%7B%0A%20%20%20%20%5Bnative%20code%5D%0A%7D&pop=function%20pop%28%29%20%7B%0A%20%20%20%20%5Bnative%20code%5D%0A%7D&push=function%20push%28%29%20%7B%0A%'
Run Code Online (Sandbox Code Playgroud)

我预计:

queryString == 'first=1&second=2'
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在我的localhost空白页面上,它运行良好.index.html页面上的其他一些javascript 会与我的代码冲突吗?如何通过仅更改我的代码(最好只更改includedScript.js文件)来修复冲突?

提前致谢.

javascript arrays

2
推荐指数
1
解决办法
221
查看次数

PHP Framework OOP模型

我想我是经验丰富的程序化PHP程序员.我已经实施了一些更大的项目.现在我想在较小的一个上尝试OOP PHP(DB导入/导出+用户身份验证的框架).由于我从未在这样的项目上尝试过OOP,因此我遇到了对象设计问题.

我想以这种方式实现框架,我只需要创建一个对象实例来使用整个框架.我还想保持代码的安排,所以我不会只为所有方法/属性实现一个类.

我怎么能把一个大班级分成几个让他们组织起来(在更多的php文件中)?

我想我必须实现一个基类,然后使用其他基类扩展它.但是那样我会有很多小班,而不是大班.

你会如何解决这个问题?

我希望我能很好地解释这个问题.

谢谢你的帮助.

php oop

1
推荐指数
1
解决办法
1183
查看次数

将隐式类型变量移动到对象初始化器

如何修改以下代码:

var people = new[] {
   new { name = "John", surname = "Smith" },
   new { name = "John", surname = "Doe" },
};
Run Code Online (Sandbox Code Playgroud)

不使用var关键字(所以我可以在对象初始化器中初始化变量)并且仍然能够访问这样的元素?:

System.Console.WriteLine(people[0].surname); //John
System.Console.WriteLine(people[1].surname); //Doe
Run Code Online (Sandbox Code Playgroud)

c# types casting

0
推荐指数
2
解决办法
50
查看次数