我有一个使用PHP提交的HTML表单,但我想要实现的是表单中输入的数据会在提交表单时自动输入到数据库中,并且电子邮件会与表单数据一起发送。
在这种情况下,我已经构建了所有内容,您填写了表格,所有数据都正确发送到了电子邮件,但没有输入数据库。我想知道我的代码的哪一部分错了或者我需要添加什么。
由于此表单具有email
、和confirmaemail
,因此我希望您能帮助我应用相应的验证,以便它可以工作。contraseña
confirmacontraseña
<?
$C_FIRST_NAME=$_POST['C_FIRST_NAME'];
$C_SECOND_NAME=$_POST['C_SECOND_NAME'];
$C_FIRST_LAST_NAME=$_POST['C_FIRST_LAST_NAME'];
$C_SECOND_LAST_NAME=$_POST['C_SECOND_LAST_NAME'];
$C_EMAIL=$_POST['C_EMAIL'];
$C_EMAIL_CONFIRMATION= $_POST['C_EMAIL_CONFIRMATION'];
$C_PASSWORD=$_POST['C_PASSWORD'];
$C_PASSWORD_CONFIRMATION=$_POST['C_PASSWORD_CONFIRMATION'];
$C_CELLPHONE=$_POST['C_CELLPHONE'];
$C_ADDRESS=$_POST['C_ADDRESS'];
$C_CITY=$_POST['C_CITY'];
$C_STATE=$_POST['C_STATE'];
$C_ZIP_CODE=$_POST['C_ZIP_CODE'];
$C_COUNTRY=$_POST['C_COUNTRY'];
$C_CREDIT_CARD_TYPE=$_POST['C_CREDIT_CARD_TYPE'];
$C_CARD_NUMBER=$_POST['C_CARD_NUMBER'];
$C_CARD_EXP_MONTH=$_POST['C_CARD_EXP_MONTH'];
$C_CARD_EXP_YEAR=$_POST['C_CARD_EXP_YEAR'];
$C_CARDHOLDER_NAME=$_POST['C_CARDHOLDER_NAME'];
$C_CARD_SECURITY_CODE=$_POST['C_CARD_SECURITY_CODE'];
$C_CARD_ZIP_CODE=$_POST['C_CARD_ZIP_CODE'];
$R1_FIRST_NAME=$_POST['R1_FIRST_NAME'];
$R1_SECOND_NAME=$_POST['R1_SECOND_NAME'];
$R1_FIRST_LAST_NAME=$_POST['R1_FIRST_LAST_NAME'];
$R1_SECOND_LAST_NAME=$_POST['R1_SECOND_LAST_NAME'];
$R1_EMAIL=$_POST['R1_EMAIL'];
$R1_EMAIL_CONFIRMATION=$_POST['R1_EMAIL_CONFIRMATION'];
$R1_CELLPHONE=$_POST['R1_CELLPHONE'];
$R1_ADDRESS=$_POST['R1_ADDRESS'];
$R1_CITY=$_POST['R1_CITY'];
$R1_STATE=$_POST['R1_STATE'];
$R1_ZIP_CODE=$_POST['R1_ZIP_CODE'];
$R1_COUNTRY=$_POST['R1_COUNTRY'];
$R1_BANKING_CTR=$_POST['R1_BANKING_CTR'];
$R1_DELIVERY_METHOD=$_POST['R1_DELIVERY_METHOD'];
$R1_BNK_ACCT_NBR=$_POST['R1_BNK_ACCT_NBR'];
$R1_BNK_ACCT_NBR_CONFIRMATION=$_POST['R1_BNK_ACCT_NBR_CONFIRMATION'];
$R1_BANK_CITY=$_POST['R1_BANK_CITY'];
$R1_BANK_STATE=$_POST['R1_BANK_STATE'];
require("connect_db.php");
mysql_query("INSERT INTO usuarios (C_FIRST_NAME,C_SECOND_NAME,C_FIRST_LAST_NAME,C_SECOND_LAST_NAME,C_EMAIL,C_PASSWORD,C_CELLPHONE,C_ADDRESS,C_CITY,C_STATE,C_ZIP_CODE,
C_COUNTRY,C_CREDIT_CARD_TYPE,C_CARD_NUMBER,C_CARD_EXP_MONTH,C_CARD_EXP_YEAR,C_CA RDHOLDER_NAME,C_CARD_SECURITY_CODE,C_CARD_ZIP_CODE,R1_FIRST_NAME,R1_SECOND_NAME,
R1_FIRST_LAST_NAME,R1_SECOND_LAST_NAME,R1_EMAIL,R1_CELLPHONE,R1_ADDRESS,R1_CITY,R1_STATE,R1_ZIP_CODE,R1_COUNTRY,R1_BANKING_CTR,R1_DELIVERY_METHOD,R1_BNK_ACCT_NBR,
R1_BANK_CITY,R1_BANK_STATE) VALUES ('.$C_FIRST_NAME.', '.$C_SECOND_NAME.'
, '.$C_FIRST_LAST_NAME.', '.$C_SECOND_LAST_NAME.', '.$C_EMAIL.'
, '.$C_PASSWORD.', '.$C_CELLPHONE.', '.$C_ADDRESS.', '.$C_CITY.'
, '.$C_STATE.', '.$C_ZIP_CODE.', '.$C_COUNTRY.'
, '.$C_CREDIT_CARD_TYPE.', '.$C_CARD_NUMBER.', '.$C_CARD_EXP_MONTH.
, '.$C_CARD_EXP_YEAR.', '.$C_CARDHOLDER_NAME.', '.$C_CARD_SECURITY_CODE.'
, '.$C_CARD_ZIP_CODE.', '.$R1_FIRST_NAME.', '.$R1_SECOND_NAME.'
, '.$R1_FIRST_LAST_NAME.', '.$R1_SECOND_LAST_NAME.', '.$R1_EMAIL.'
, '.$R1_CELLPHONE.', '.$R1_ADDRESS.'
, '.$R1_CITY.', '.$R1_STATE.', '.$R1_ZIP_CODE.'
, '.$R1_COUNTRY.', '.$R1_BANKING_CTR.', '.$R1_DELIVERY_METHOD.'
, '.$R1_BNK_ACCT_NBR.', '.$R1_BANK_CITY.'
, '.$R1_BANK_STATE.')");
?>
<?php
if ($_POST['submit'] != "")
{
// reciever
$to = '[email protected]';
// subject
$subject = 'NEW ENROLLMENT';
// message
$message = '
<html>
<head>
<title>'.$subject.'</title>
</head>
<body>
<b>NEW CUSTOMER REGISTRATION FORM</b><br>
<br>
<strong>CUSTOMER INFORMATION</strong><br>
FIRST NAME : <b>'.$_POST["C_FIRST_NAME"].'</b><br>
SECOND NAME : <b>'.$_POST["C_SECOND_NAME"].'</b><br>
FIRST LAST NAME : <b>'.$_POST["C_FIRST_LAST_NAME"].'</b><br>
SECOND LAST NAME : <b>'.$_POST["C_SECOND_LAST_NAME"].'</b><br>
EMAIL : <b>'.$_POST["C_EMAIL"].'</b><br>
EMAIL CONFIRMATION : <b>'.$_POST["C_EMAIL_CONFIRMATION"].'</b><br>
PASSWORD : <b>'.$_POST["C_PASSWORD"].'</b><br>
PASSWORD CONFIRMATION : <b>'.$_POST["C_PASSWORD_CONFIRMATION"].'</b><br>
CELLPHONE NUMBER : <b>'.$_POST["C_CELLPHONE"].'</b><br>
ADDRESS : <b>'.$_POST["C_ADDRESS"].'</b><br>
CITY : <b>'.$_POST["C_CITY"].'</b><br>
STATE : <b>'.$_POST["C_STATE"].'</b><br>
ZIP CODE : <b>'.$_POST["C_ZIP_CODE"].'</b><br>
COUNTRY OF RESIDENCE : <b>'.$_POST["C_COUNTRY"].'</b><br>
<br>
<b>CUSTOMER PAYMENT METHOD</b><br>
PAYMENT CARD TYPE : <b>'.$_POST["C_CREDIT_CARD_TYPE"].'</b><br>
PAYMENT CARD NUMBER : <b>'.$_POST["C_CARD_NUMBER"].'</b><br>
PAYMENT CARD EXP DATE : <b>'.$_POST["C_CARD_EXP_MONTH"].' / '.$_POST["C_CARD_EXP_YEAR"].'</b><br>
PAYMENT CARDHOLDER NAME : <b>'.$_POST["C_CARDHOLDER_NAME"].'</b><br>
PAYMENT CARD SECURITY CODE : <b>'.$_POST["C_CARD_SECURITY_CODE"].'</b><br>
PAYMENT CARD ZIP CODE : <b>'.$_POST["C_CARD_ZIP_CODE"].'</b><br>
<br>
<b>RECEIVER INFORMATION</b><br>
FIRST NAME : <b>'.$_POST["R1_FIRST_NAME"].'</b><br>
SECOND NAME : <b>'.$_POST["R1_SECOND_NAME"].'</b><br>
FIRST LAST NAME : <b>'.$_POST["R1_FIRST_LAST_NAME"].'</b><br>
SECOND LAST NAME : <b>'.$_POST["R1_SECOND_LAST_NAME"].'</b><br>
EMAIL : <b>'.$_POST["R1_EMAIL"].'</b><br>
EMAIL CONFIRMATION : <b>'.$_POST["R1_EMAIL_CONFIRMATION"].'</b><br>
CELLPHONE NUMBER : <b>'.$_POST["R1_CELLPHONE"].'</b><br>
ADDRESS : <b>'.$_POST["R1_ADDRESS"].'</b><br>
CITY : <b>'.$_POST["R1_CITY"].'</b><br>
STATE : <b>'.$_POST["R1_STATE"].'</b><br>
ZIP CODE : <b>'.$_POST["R1_ZIP_CODE"].'</b><br>
COUNTRY OF RESIDENCE : <b>'.$_POST["R1_COUNTRY"].'</b><br>
<br>
<b>RECEIVER BANK ACCOUNT INFORMATION</b><br>
BANKING INSTITUTION : <b>'.$_POST["R1_BANKING_CTR"].'</b><br>
DELIVERY METHOD : <b>'.$_POST["R1_DELIVERY_METHOD"].'</b><br>
BANK ACCOUNT NUMBER : <b>'.$_POST["R1_BNK_ACCT_NBR"].'</b><br>
ACCOUNT NUMBER CONFIRMATION : <b>'.$_POST["R1_BNK_ACCT_NBR_CONFIRMATION"].'</b><br>
BANK CITY OF LOCATION : <b>'.$_POST["R1_BANK_CITY"].'</b><br>
BANK STATE OF LOCATION : <b>'.$_POST["R1_BANK_STATE"].'</b><br>
</body>
</html>
';
// To send HTML mail, the Content-type header must be set
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Additional headers
$headers .= 'To: '.$to. " \r\n";
$headers .= 'From: REMESAS ENVIA <[email protected]>' . "\r\n";
// Mail it
mail($to, $subject, $message, $headers);
}
?>
<script type="text/javascript">
var pagina = 'ending_page.php';
var segundos = 0;
function redireccion() {
document.location.href=pagina;
}
setTimeout("redireccion()",segundos);
</script>
在数据库中,所有字段都允许NULL除了作为自动增量的 ID 之外,但我不知道它是仅在每次输入新用户的数据时创建还是必须创建才能使其正常工作。我希望你能帮我解决这个问题,谢谢。
我不知道你代码的哪一部分导致数据插入失败(我们可能会在我写答案时发现,我认为会很长)我发现了错误,我将解决方案放在最后,但我将指出您应该尽快更改代码的某些部分。在进一步进行项目之前,您必须进行其中一些更改,因为其中一些确实是严重的安全问题。该列表没有特定的顺序。
停止使用功能
mysql_*
,使用mysqli_*
或PDO
您正在使用
mysql_*
PHP 5.5 中已弃用/弃用的函数,并且自 PHP 7.0 版以来已完全删除。相反,您应该使用PDO或MySQLi。使用不受支持且官方 PHP 页面本身不建议使用的技术进行开发是没有意义的。清理输入参数
永远不要相信用户发送给您的文本。始终假设用户是一个邪恶的人,试图破坏您的数据库和网站并将他们的输入视为此类。99.9% 的用户将是想要访问您页面的好人,但只需 1 个坏人在几秒钟内摧毁多年的辛勤工作。
如果您使用参数化查询,这将不是什么大问题,这让我想到了下一点。
不要使用动态 SQL,使用准备好的查询
此失败是因为您使用的函数
mysql_*
不支持准备好的/参数化查询。当您切换到mysqli_*
PDO 时,您可以(并且应该)使用准备好的查询。这将防止您的代码容易受到 SQL 注入攻击,是的,您的代码容易受到 SQL 注入攻击。不仅从安全的角度来看,而且从可用性的角度来看:动态 SQL 的人为错误和查询失败的可能性高于准备好的查询。
清理你的输出参数
如果您不知道输出参数的来源,那么与清理输入参数同样重要的是清理输出参数。现在您正在将用户输入写入您的网页而不对其进行清理,这会使您的代码容易受到 XSS(跨站点脚本)攻击,恶意用户可以插入他们自己的 JavaScript 代码以在您的页面上运行!就好像它是您自己的代码一样!
更好地利用重定向
meta
这与安全性没有直接关系,它更像是一个可用性建议:当您可以通过 PHP 或 HTML(使用)标签进行重定向时,不要使用 JavaScript 进行重定向。当您拥有代码时,执行您的操作并生成一个 JavaSCript 以重定向到第二个页面,这很糟糕,因为:a) 用户可能禁用了 JavaScript,然后他们只会看到一个空白页面;并且b)您正在为必须接收页面的用户产生不必要的流量,当您可以使用
header
PHP获得类似结果而无需将数据发送到客户端并且您收到新页面请求时,它所做的只是重定向.如何解决插入问题?
问题是您如何动态生成 SQL 查询(如上所述,您不应该这样做):
如果你看一下,
'.$C_CARD_EXP_MONTH.
你会发现你缺少一些使查询在语法上错误并且没有执行的结束引号。但是还有更多,即使在解决了该问题之后,还有更多问题:要么您在许多地方缺少双引号,要么您在这些相同的地方有额外的句点。这将使您的字段没有您认为它们具有的长度和内容(它们将在开头和结尾都有一个句点)。实际上,如果您的任何字段不是 varchar/text 而是数字,则插入将直接失败。
让我们直接看一个信用卡到期年份的例子([当看到表单处理敏感数据并且存在严重的安全问题时插入带有惊慌表情的图标]):
执行替换时,它将保持为
, '.2018.',
. 如果您数据库中的字段是数字或年份,则会因为值错误而失败。查看连接文件是否正在建立连接...尝试在数据库中搜索某些内容或使用
MySqlWorkbench
.如果您查看 MySqlWorkbench,您还可以查看 INSERT 命令是否正确。
MySqlWorkbench->Management->Client Connections
.我认为你的插入命令是错误的,回显它来修复它。另一种方法是尝试在开头插入几个字段并在执行前几个插入后添加。
干杯,