我有两个PHP类.一种是连接数据库,构建查询,执行它们以及断开与数据库的连接.另一个类是供用户使用:添加,更新,登录等.
我在争论是否应该全局连接到页面上的数据库并使用该连接(将数据库对象传递给用户对象的方法),或者我是否应该从用户方法本身内连接和断开数据库.
我看到全局连接的优点是,一旦连接,我就可以使用该连接来执行多种方法.缺点是我需要担心传递数据库对象.
在该方法中连接的优点是它完全透明,但是,可能存在4或5个连接建立和断开,这可能导致开销.
是否有最佳实践使用,或者它真的取决于用户数量和服务器的规格,例如内存,CPU等.系统需要支持多达约1,000个用户,因此它的规模相当小.
任何反馈都将非常感激.
-Ryan
我在这里阅读了很多关于过滤用户输入的问答,但大多数时候答案是它取决于你在做什么.这是我正在做的事情:
通过将在MySQL查询中使用的表单提交的数据:
function clean($field, $link)
{
return mysql_real_escape_string($field, $link);
}
Run Code Online (Sandbox Code Playgroud)
通过表格提交的数据将显示在HTML/PHP页面或电子邮件中:
function output_html($value)
{
return stripslashes(htmlspecialchars($value));
}
Run Code Online (Sandbox Code Playgroud)
从数据库显示的数据:
function output_db($value)
{
return stripslashes($value);
}
Run Code Online (Sandbox Code Playgroud)
这是否足以满足我的需求?有什么我不考虑的吗?
谢谢!
我有以下内容:
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} protected [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !protected [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
如果目录名为"protected",请确保用户使用https.如果目录是除"protected"之外的任何内容,请确保用户使用http.
这很好用,但如何指定其他目录?
此外,有没有一种方法可以实现这一点,而无需两次指定目录?一次包括它和一次排除它?
谢谢!
UPDATE
虽然我的"受保护"文件夹由于我的规则而被迫使用https,但是对"不受保护"文件夹中的图像,样式表和javascripts的任何引用仍然被重定向到http.这导致"受保护"页面仅部分安全.在重定向代码之前添加以下内容可解决此问题:
RewriteRule \.(css|gif|jpe?g|js|png|swf)$ - [L]
Run Code Online (Sandbox Code Playgroud) 我有一个风格的按钮和风格的链接(以匹配按钮的风格).我在Chrome 13,Firefox 6和IE 9中测试它.按钮和链接在所有三种浏览器中看起来都相同,除了在Firefox中链接的高度更短.http://jsfiddle.net/AWcYG/
我无法在链接上应用高度,因为它不是块级元素.如果我把它作为块级元素,我必须浮动它们以使它们彼此相邻.此外,然后在所有三个浏览器中关闭高度.我考虑过绝对定位,但是除非我对其位置进行硬编码,否则我没有办法让它们彼此相邻.
除了使用条件语句之外,还有什么方法可以在三个浏览器中使按钮和链接的高度匹配?也许是一个我不知道的黑客,或者我错过了什么?
更新:
@Wesley感谢你指点我的方向.我发现Firefox在其按钮上添加了以下内容,这解释了为什么您的代码可以执行以下操作:
button::-moz-focus-inner,
input[type="reset"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner,
input[type="file"] > input[type="button"]::-moz-focus-inner {
padding: 0px 2px 0px 2px;
border: 1px dotted transparent;
}
Run Code Online (Sandbox Code Playgroud)
结果非常接近完美,但在Firefox 6中它仍然是1px.我可能会研究一下这个并发布另一个更新,如果我找到一个修复,但即使只有1px关闭,它仍然比以前好多了!
更新2:
我找到的修复是指定按钮上的高度:
.db .menu input,
.db .menu a {
background-color: #01137F;
border: 1px solid #fff;
border-radius: 5px;
box-shadow: 2px 2px 3px #666;
color: #fff;
cursor: pointer;
font-family: Arial, sans-serif;
font-size: 14px;
height: 26px;
padding: 4px 10px;
}
Run Code Online (Sandbox Code Playgroud)
在我指的所有三个浏览器中,添加高度使按钮与像素完全相同.
我有10个顶级域名,例如example1.com,example2.com,example3.com等,每个域都有自己独特的网站(不是重定向).我的目标是为所有10个网站设置一个Google Analytics帐户和一个网络媒体资源,一个主要配置文件(默认设置)显示所有网站的指标,以及每个网站的10个个人配置文件,以便将视图限制为该网站. ..好像它有自己的Google Analytics帐户.经过大量的研究和阅读,我认为我确定我需要做的就是将以下代码添加到每个网站:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXXX']);
_gaq.push(['_setDomainName', 'example1.com']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
Run Code Online (Sandbox Code Playgroud)
每个网站上唯一会改变的_setDomainName是匹配网站的地址,例如example2.com,example3.com等.
此外,一个网站实际上位于顶级域名的子域(anothersite.example4.com),所以我猜我会把它完全_setDomainName放在该实例的变量中(无论它是否是顶级域名)级域或子域.
有人可以证实我正确解释了这个吗?我是否遗漏了任何内容,如果我拥有所有10个网络媒体资源并希望稍后为每个网站管理员创建一个帐户来查看其网站的指标,这是一个很好的设置方法吗?
结果总是1:
$sql = 'SELECT COUNT(Vote) FROM ' . $table;
$res = mysql_query($sql, $conn);
$vote_total = mysql_num_rows($res);
Run Code Online (Sandbox Code Playgroud)
我在phpMyAdmin中运行$ sql查询并返回3,因此查询不是问题.$ vote_total全局初始化为0,因此1来自某个地方.我需要提供哪些其他信息才能让我更轻松?
谢谢,瑞恩
可能重复:
如何在PHP中验证emailaddress
我想知道每个人在验证电子邮件地址方面做了些什么,以及验证需要多大.
例如,那些方法中哪一个是首选的,为什么?
我的目标是为普通项目找到一个好的和可靠的解决方案,所以当需要验证电子邮件地址时,我确切地知道我将要使用的内容.
任何反馈非常感谢!
-Ryan
我有一个调查脚本,每页有3个问题.当用户回答第一页上的问题并单击下一步时,$_SESSION['survey']['data']通过执行以下操作存储上一页中的数据:
$data = postToArray($_POST, $ignore_fields);
$_SESSION['survey']['data'] = $data;
Run Code Online (Sandbox Code Playgroud)
$data 是一个看起来像这样的数组:
array('question' => 'answer', 'question' => 'answer');
Run Code Online (Sandbox Code Playgroud)
postToArray在返回之前,做一些检查并稍微操纵实际提交$data.
当用户在调查的第二页时,同样的事情发生了.我假设当$data被添加到会话时,$_SESSION['survey']['data'] = $data;如果'question'(密钥)不存在,它将附加到会话数组,但是如果它(因为用户转到上一页并更改了他们的答案),那么具有相同键的现有值将被覆盖,但是最后一页的提交将覆盖['data']会话中数组中的所有内容.来考虑一下,这非常有意义.
我尝试了各种各样的东西,比如检索$_SESSION['survey']['data'],将它存储在数组中,读取最后一个提交,合并数组,然后在SESSION中重新保存所有内容,但我的代码没有用 - 这种方法有意义吗?那可能吗?
我也试过了array_push,但那里没有运气.
另外,我尝试添加$_SESSION['survey']['data'][],至少保存所有内容(每个提交在自己的数组中),但是如果用户返回页面,他们更改和重新提交的任何值都将添加为另一个数组.
最好是,我想要一个包含所有问题/答案的巨型数组,并且它会不断添加到该数组并使用现有键覆盖任何值.
什么是最好的方法?
谢谢,-Ryan
实施的解决方案
$data = postToArray($_POST, $ignore_fields);
foreach($data as $question => $answer)
{
$_SESSION['survey']['data'][$question] = $answer;
}
Run Code Online (Sandbox Code Playgroud) 我依稀记得以前遇到过这个问题,但我想知道这是否在PHP中不起作用:
echo $counter; // outputs 4
$output = $counter--;
echo $output; // outputs 4
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
$output = $counter - 1;
Run Code Online (Sandbox Code Playgroud)
我没有任何问题.
有人可以对此有所了解吗?
谢谢,瑞恩
今天我在我正在构建的内容管理系统中添加了一个新功能.根据您上传图像的位置,PHP将调整图像大小以适合指定的位置.它工作得很好,但是当我尝试上传更大的图像时,就像3MB图像一样,我遇到了一个致命的错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 42520 bytes) in...
Run Code Online (Sandbox Code Playgroud)
我认为128MB的内存是相当多的,考虑到我没有跑那么多......至少我不这么认为.它试图为调整大小过程分配另外42520个字节,但失败了.
我的问题是我应该(A)增加限制还是(B)重新评估为什么我首先使用这么多内存?128MB是一个好数字还是太大/太少?
谢谢,瑞恩
解析度
我得出结论,128MB对于调整图像大小实在太大了,我非常专注于查看其他选项...比如exec()选项,我从未仔细研究过我的"样本"数据.事实证明,即使我的大图像只有2.83MB,它的宽度也超过10000px.那是个问题.:)
我有一个包含以下列的表:user_id,key,value和flag.SELECT,FROM,WHERE,GROUP BY和ORDER BY按预期自行工作.当我尝试将密钥添加到表中时,我收到一个错误,表示要检查我的语法.关键是问题,价值就是答案.我想要一个结果,显示所有可能答案的所有问题以及答案发生频率的计数.
SELECT value AS 'Answer', count(*) AS 'Total Votes'
FROM survey_data sd
INNER JOIN (SELECT key FROM sd GROUP BY key) T1 ON T1.key = sd.key
WHERE flag != 1
GROUP BY value
ORDER BY 'Total Votes' DESC
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
作为旁注,当我在没有INNER JOIN的情况下运行此查询时,结果不是通过'Total Votes'对DESC进行排序 - 是否有人知道问题的原因或原因?
谢谢,瑞恩