我想编写一个基于状态机的(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)
这意味着我不能在循环中遍历字符串以检查单个字符,因为我永远不知道我是否在角色的中间.
所以问题是:
为什么学说(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发送另一个查询??)
我有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并使用触发器对其进行更新。这样,我可以将索引添加到两个列中,并且排序应该更快。
还有其他方法可以优化查询吗?
谢谢
我有以下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函数,但它看起来不是最清晰的解决方案.
有什么建议?
谢谢
在页面上我使用类似的语法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文件)来修复冲突?
提前致谢.
我想我是经验丰富的程序化PHP程序员.我已经实施了一些更大的项目.现在我想在较小的一个上尝试OOP PHP(DB导入/导出+用户身份验证的框架).由于我从未在这样的项目上尝试过OOP,因此我遇到了对象设计问题.
我想以这种方式实现框架,我只需要创建一个对象实例来使用整个框架.我还想保持代码的安排,所以我不会只为所有方法/属性实现一个类.
我怎么能把一个大班级分成几个让他们组织起来(在更多的php文件中)?
我想我必须实现一个基类,然后使用其他基类扩展它.但是那样我会有很多小班,而不是大班.
你会如何解决这个问题?
我希望我能很好地解释这个问题.
谢谢你的帮助.
如何修改以下代码:
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)