我对某些事感到非常困惑,并且想知道是否有人可以解释.
在PHP中我验证用户输入所以htmlentitiies,mysql_real_escape_string在插入数据库之前使用,而不是在所有内容上,因为我喜欢使用正则表达式,尽管我发现它们很难处理.现在显然我将使用mysql_real_escape_string,因为数据进入数据库但不确定我是否应该使用htmlentities()仅在从数据库获取数据并将其显示在网页上时这样做才能改变由人输入的数据是不保留它的原始形式,如果我想稍后使用该数据用于其他东西,可能会导致问题.
例如,我有一个带有3个字段名称,主题和消息的留言簿.现在显然字段可以包含任何像js标签中的恶意代码基本上什么,现在让我困惑的是让我说我是一个恶意的人,我决定使用js标签和一些恶性js代码并提交表单,现在基本上我有恶意我的数据库中无用的数据.现在通过使用htmlentities将恶意代码输出到网页(留言簿)这不是问题,因为htmlentities已将其转换为安全等价物,但同时我在数据库中有无用的恶意代码,我宁愿不拥有.
所以在说完这一切之后我的问题是我应该接受这样一个事实,即数据库中的某些数据可能是恶意的,无用的数据,只要我在输出中使用htmlentities一切都会好的,或者我应该做其他事情吗?
我读了很多书,说过在接收数据时过滤数据并在输出数据时将其转义,因此保留了原始表单但是他们只提供了一些示例,例如确保字段只是使用已经内置到php中的函数的int但我从未找到过任何关于确保类似于留言簿的内容,您希望用户输入他们想要的任何内容,还有除了mysql_real_escape_string()之外如何过滤这些数据以确保它不会破坏数据库查询?
请有人请最终为我解决这个困惑并告诉我应该做什么以及最佳做法是什么?
感谢任何可以解释的人.
干杯!
基本上在显示来自MySQL数据库的数据时,我有一个htmlspecialchars()函数,它应该将单引号和双引号转换为它们的安全实体.我遇到的问题是查看源代码,它只在转换< > &时才需要转换单引号和双引号.
//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
Run Code Online (Sandbox Code Playgroud)
然后当我想用我做的时候:
htmlsan($row['comment']);
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么它不会转换单引号和双引号吗?
UPDATE
有什么奇怪的htmlsan()是用在电子邮件中的评论中,当我查看电子邮件的源代码时,它会转换它们,似乎它不会在网页上显示时转换数据库中的单/双引号.我的数据库排序规则也设置为utf8_general_ci,我声明我在数据库连接等上使用utf8.
我在下面编写了一些代码,目前我正在测试,所以代码中没有数据库查询.
即使文件不是0字节并且其中有16个字节的数据,下面的代码if(filesize($filename) != 0)总是会else出现.我无处可去,似乎总是认为文件是0字节.
我认为显示我的代码更容易(可能是其他错误,但我正在检查每个错误,我一个接一个地处理它们).我没有PHP错误或任何东西.
$filename = 'memberlist.txt';
$file_directory = dirname($filename);
$fopen = fopen($filename, 'w+');
// check is file exists and is writable
if(file_exists($filename) && is_writable($file_directory)){
// clear statcache else filesize could be incorrect
clearstatcache();
// for testing, shows 0 bytes even though file is 16 bytes
// file has inside without quotes: '1487071595 ; 582'
echo "The file size is actually ".filesize($filename)." bytes.\n";
// check if file contains any data, also tried !==
// always …Run Code Online (Sandbox Code Playgroud) 我已经用 PHP 编写了代码,但今天我第一次需要验证选择框,并惊讶地发现我实际上不知道如何验证。基本上这是我的 HTML:(忽略代码中的会话内容)
<label for="gender">Gender</label>
<select id="gender" name="gender" class="select option">
<option<?php if( $_SESSION['gender'] === "" ) { echo ' selected="selected"'; } ?> value=""> </option>
<option<?php if( $_SESSION['gender'] === "Male" ) { echo ' selected="selected"'; } ?> value="Male">Male</option>
<option<?php if( $_SESSION['gender'] === "Female" ) { echo ' selected="selected"'; } ?> value="Female">Female</option>
</select>
Run Code Online (Sandbox Code Playgroud)
基本上我写了下面的 php 代码,认为它会验证它,但无论我是否使用 Firebug 在浏览器中篡改这些值,它总是返回性别无效错误。
我的编辑个人资料表单的其余部分工作正常,选择框也工作正常(无需验证),但显然我需要验证它,因为用户个人资料的数据库中没有更新男性、女性或没有任何更新。我做了 mysql_real_escape 字符串等,但出于简单性等原因没有在此处添加。
$gender = $_POST['gender'];
if(!empty($gender) && $gender != "Male" || $gender != "Female"){
$error[] = "Gender not valid";
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释我如何检查选择框中的值以确保它们不被篡改并且包含男性、女性或不包含任何值,我将不胜感激。也许我的做法是错误的。
我已经有一个完全承诺的会员制度,并希望整合我自己的用户推荐系统,但想要一些提示,建议真正做到这一点.
我当前的注册用户表是类似的
用户(表)
- id(用户ID)
- 电子邮件(用户电子邮件)
- 密码(用户密码的哈希值)
- reg_date(用户注册日期)
我还有其他一些领域,但与我想做的事情无关,为了让事情尽可能简单,我把它们排除在外.
我正在考虑创建一个名为referrals的新表,例如当用户表中我的网站上的注册用户引用某人时(我想我会创建一个表单,询问他们想要引用的人的电子邮件及其名称并将其添加到然后它会在那里显示他们推荐的人以及他们推荐了多少人,以及他们推荐的人是否加入了我的网站.
我希望有人能够在我的推荐表中解释我需要的逻辑来跟踪推荐吗?
到目前为止我的表看起来像这样:
referments(table)
- uid(引用者的id,这将是来自users表的注册用户)
- ref_count(来自users表的引用者总数引用了人)
- action(可能不是rite名称)(如果被引用的人已完成)注册)
- 我想某些人或某事被提及的人,不确定以及我可能还需要什么.
显然,在注册页面上我会有一个推荐人文本框,用户可以输入他们被推荐的用户名,并检查他们是否被已注册的会员推荐,我想在推荐电子邮件链接中我会添加推荐的用户和在注册页面做一个简单的检查就像注册一样?ref = username_here
如果ref通过get自动将用户名添加到文本框中.
正如你所看到的那样,我正在努力应对推荐表背后的逻辑,如果有人可以解释我还需要什么,我会喜欢它吗?我需要在php中完成所有工作(而不是代码),这只是我应该做的快速粗略指导.我知道我需要做一些检查等检查,以确保他们之前没有提到它们(出于垃圾邮件的原因),并且他们想要推荐的人的电子邮件之前没有被其他人推荐(出于垃圾邮件的原因)他们想要推荐的人的电子邮件不存在于用户表等已经注册的成员中.
也许我正在努力比实际更难,但我出于某种原因没有得到它背后的逻辑,如果有人能告诉我,我正在做的事情是完全错误的,而不是最好的方法去做它请做.
我想你可以说我要求一个推荐表的模型(草稿)来做我想要的事情以及我应该在php中做的事情将它们整合在一起.
我有一个发送网站电子邮件的功能(使用phpmailer),我想要做的基本上是用php替换email.tpl文件中的所有placheholders,其中包含我提供的内容.对我来说问题是我不想重复代码因此我创建了一个函数(下面).
没有php函数,我会在脚本中执行以下操作
// email template file
$email_template = "email.tpl";
// Get contact form template from file
$message = file_get_contents($email_template);
// Replace place holders in email template
$message = str_replace("[{USERNAME}]", $username, $message);
$message = str_replace("[{EMAIL}]", $email, $message);
Run Code Online (Sandbox Code Playgroud)
现在我知道如何做其余的但是我被困在str_replace()上面,如上所示,我有多个str_replace()函数来替换电子邮件模板中的占位符.我想要的是添加str_replace()到我的函数(下面)并让它找到[\]我给它的电子邮件模板中的所有实例,并将其替换为我将给它的占位符值,如下所示:str_replace("[\]", 'replace_with', $email_body)
问题是我不知道如何将多个占位符及其替换值传递给我的函数,并让我str_replace("[{\}]", 'replace_with', $email_body)处理我给它的所有占位符并替换相应的值.
因为我想在多个地方使用该函数并避免重复代码,在某些脚本上我可能会传递函数5占位符和值,而另一个脚本可能需要传递10个占位符和值,以便在电子邮件模板中使用该函数.
我不确定是否需要在将使用该函数的脚本上使用一个数组,并且函数中的for循环可能使我的php函数从脚本中获取xx占位符和xx值并且循环占位符并用值替换它们.
这是我上面提到的功能.我对脚本进行了评论,这可能更容易解释.
// WILL NEED TO PASS PERHAPS AN ARRAY OF MY PLACEHOLDERS AND THERE VALUES FROM x SCRIPT
// INTO THE FUNCTION ? …Run Code Online (Sandbox Code Playgroud) 我有一个textarea,我想在页面加载时显示一些默认文本.单击textarea后,我希望文本消失,如果用户在textarea中单击并且没有输入任何内容然后单击textarea,则默认文本将再次显示.
我已经搜索过谷歌并且在这里,但我似乎只能找到与文本框相关的教程而不是 textareas,而且我已经在textarea上使用了一个类,所以不能依赖于类来工作.
有没有人有一些简单的jQuery代码,他们想与我分享,以做我想要的上面?
我安装了WAMP,并决定在最新版本的WAMP中使用默认的Apache 2.1.7; 原因是我的主机服务器我的网站也使用2.1.7.以前,我在WAMP中使用Apache 2.2.11,因为我的上一个主机也使用了该版本.
我现在遇到的问题是我似乎有一些调试器或某些东西,因为我得到一个PHP错误它显示如下图所示,错误没有记录到PHP错误日志,即使它已启用,等等php.ini.当我切换回早期的Apache版本时,所有错误都记录在PHP错误日志中.
所以一定是Apache.基本上我希望PHP像以前一样将错误记录到PHP错误日志中.为什么会发生这种情况以及如何改变它?
我不介意错误的显示方式,因为它无论如何都有帮助,因为我可以更好地看到它,但我仍然喜欢它也可以登录到PHP错误日志.
这是自从在WAMP中切换Apache版本以来PHP错误的样子;
这是图像:

我有一个在桌面上执行MySQL查询的网页.我有它在表格中回应它并且它应该工作,例如:
$query = mysql_query("SELECT * FROM table");
while($row = mysql_fetch_array($query){
// my table and db stuff echos out here
}
Run Code Online (Sandbox Code Playgroud)
现在使用相同的mysql查询$ query我试图在同一页面上使用相同的查询在下面回显它但我的问题是它似乎不起作用.
现在你可能会认为我正在做的事情是奇怪的,但之所以上面的第一个代码在表格中回显数据,而且这些东西旁边的复选框就像表格一样回应出来.一切正常,但似乎我不能在同一个查询上面循环上面做另一个.第二个与上面完全相同; 唯一的区别是它不是一种形式.
我只能做一个while(),并mysql_fetch_assoc在一个查询一次?
更新:
对不起,我仍然不理解.
这是我的代码; 谁能为我编辑它?
(我无法在代码中放置php标签以从PHP代码中分离HTML.抱歉给您带来任何不便).
$q = mysql_query("SELECT * FROM table");
<h1> Vote for your favourite extension </h1>
<form method="post" action="<?php echo basename(__file__); ?>">
<table>
<tbody>
<tr class="odd">
<td colspan="3" class="cellfeat" style="text-align: center;">Vote for your favourite extension</td>
</tr>
<?php
if(!$q){
// query failed etc
} else { // query …Run Code Online (Sandbox Code Playgroud) 我希望在7天或更早的时候删除数据库中的记录.我的服务器时间设置为英国时间,但出于某种原因,我在下面写的代码总是回显的帐户被删除为7天或更长时间,由于某种原因,它不起作用.在我测试我的测试数据库之前,我决定现在使用一个简单的回声,但正如我所说它不会起作用.
任何人有任何建议,为什么它不工作?我一定做错了什么.
<?php
// Get Current Time
$current_time = time();
/* The time i used below (unix) for testing is
18-02-2011 14:34:24 (yesterdays date/time) */
$account_delete = strtotime(time('1298039664'));
if ($current_time - $account_delete >= (7*24*60*60)){
echo 'Account Deleted as 7 or more days old';
} else {
echo 'Account Not Deleted as less than 7 days old';
}
?>
Run Code Online (Sandbox Code Playgroud) 我已经开发了一个推荐系统,登录的会员可以将推荐信息发送给那里的家人/朋友,以推荐他们注册.
一切正常,但昨天我决定限制一个人可以在24小时内发送的最大推荐.我将此限制为每天最多3次推荐.
我发布了一些代码,我似乎在下面遇到了问题.我遇到的问题是,无论看起来如何,我都会收到错误消息,说我已达到今天的最大推荐.我不确定我的代码中出错了什么.
// referral query
$referral_limit = mysql_query("SELECT 'created_on' FROM 'user_referrals'
WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());
if(mysql_num_rows($referral_limit) > 0){
while($row = mysql_fetch_assoc($referral_limit)){
$db_time = $row['created_on'];
if((time() - $db_time) > 86400){
// is within 24 hours and has reached maximum daily referral allowance
$error[] = "You have reached the maximum referrals for today.";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我曾尝试和回声出$ db_time当我做我得到返回的字段名是created_on,而不是实际值在这种情况下应该显示时间戳.该created_on数据库字段包含一个引用被做了时间戳和我检查是为了确保转诊用户没有在过去24小时内进行转诊.
您还会注意到我没有添加额外的位将其限制为每天3,但我不想添加该位,直到我可以先解决此问题.
数据库表如下所示:
CREATE TABLE IF NOT EXISTS `user_referrals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`referrer_uid` int(11) …Run Code Online (Sandbox Code Playgroud) php ×10
mysql ×3
datetime ×2
referrals ×2
validation ×2
apache ×1
date ×1
default ×1
file ×1
function ×1
html-table ×1
javascript ×1
jquery ×1
placeholder ×1
select ×1
str-replace ×1
textarea ×1
time ×1
unix ×1
while-loop ×1