【发布时间】:2016-04-25 18:23:16
【问题描述】:
我正在尝试让我的 php 页面自动生成一封电子邮件,并在他们的帐户发生更改时将其发送给收件人,并列出帐户更改。
我有什么工作,但只有当我只更改用户的登录名时,如果其他任何更改都不起作用。
如果我只更改用户的登录名,则会发送电子邮件并在电子邮件正文中列出更改。
如果有任何其他更改,则发送电子邮件,但只有表头,没有其他内容(包括登录名)。
这是我所拥有的:
Generate list of things that were changed based on input results vs database
$ret = $db->query("SELECT * from Users WHERE LoginName='$loginNameFromPost' LIMIT 1;");
while($row = $ret->fetchArray(SQLITE3_ASSOC) ){
//list changes
if(strcmp($row['LoginName'],$loginNameFromPost) != 0) {
$lnchange = 1;
}
if(strcmp($row['Email'],$emailFromPost) != 0) {
$emchange = 1;
}
if(strcmp($row['DisplayName'],$displayNameFromPost) != 0) {
$dnchange = 1;
}
if(strcmp($row['Level'],$levelFromPost) != 0) {
$lchange = 1;
}
if(!empty($passwordFromPost)) {
$pwchange = 1;
}
}
任何更改的值都将为1。
Generate email body
$message = '
<html>
<head>
<title>Changes to your account - TRG Repair Log</title>
</head>
<body>
<p>Some changes were made to your account by an administrator.</p>
<table style="border:1px solid black;">';
$message .= '<tr>
<th>Setting</th><th>New Setting</th>
</tr>';
if($lnchange == 1) {
$message .= '<tr>
<td>Login Name</td><td>'.$loginNameFromPost.'</td>
</tr>';
}
if($emchange == 1) {
$message .= '<tr>
<td>Email</td><td>'.$emailFromPost.'</td>
</tr>';
}
if($dnchange == 1) {
$message .= '<tr>
<td>Display Name</td><td>'.$displayNameFromPost.'</td>
</tr>';
}
if($lchange == 1) {
$message .= '<tr>
<td>Clearance Level</td><td>'.$levelFromPost.'</td>
</tr>';
}
if($pwchange == 1) {
$message .= '<tr>
<td>Password</td><td>Contact '.$_SESSION['tech'].'</td>
</tr>';
}
$message .= '</table>
</body>
</html>
';
这使用if 语句并在值已更改时连接字符串。
我非常卡在这里,不知道为什么它不起作用。近一个小时以来,我一直在尝试不同的事情。
解开疑惑: 我有一个连接到上面脚本的 html 表单。
假设我转到我的表单,并且只更改数据库中任何用户的登录名 - 电子邮件已发送,并且在电子邮件中它具有表中列出的更改后的登录名。
假设我去同一个表单,并更改登录名和显示名称(或电子邮件、密码、级别等) - 电子邮件已发送,但在电子邮件中它只有表的标题假设列出所做的所有更改。表中未列出其他信息。
我的数据库标题:
发布的变量:
$loginNameFromPost = SQLite3::escapeString($_POST['loginname']);
$passwordFromPost = SQLite3::escapeString($_POST['password']);
$emailFromPost = SQLite3::escapeString($_POST['email']);
$displayNameFromPost = SQLite3::escapeString($_POST['displayname']);
$levelFromPost = SQLite3::escapeString($_POST['level']);
HTML 表单视图:
仅更改登录名的结果:
如果任何其他(除了登录名)被更改(如果登录名与其他任何内容一起更改,结果相同):
【问题讨论】:
-
LIMIT 1的目的是什么?超出了它明显的作用。 -
@stackoverfloweth 它不应该有所作为,但在极少数情况下,管理员可能不小心重复了 LoginName,它会被处理。
-
你能请
echo你所有的$row['Email'],$emailFromPost,$row['Email'],$emailFromPost,...比较吗? -
这可能有助于我们查看表单的代码以确保名称正确,特别是因为您说如果
LoginName更改它可以正常工作,但您的示例显示显示名称更改成功. -
@fislerdata 您的评论帮助我找出了哪里出错了。我的意思是将查询设置为按 uniqueID 搜索,但我让它按正在更改的 POST 中提供的名称进行搜索
not sure how I managed that one