在PHP代码中查找未定义的偏移量错误时出现问题



我很难知道为什么这个错误不断发生,也不知道如何解决。我已经在其他帖子上看到过这个错误,但我不清楚为什么。

该错误称为

Undefined offset

$emails = array();
$emailtosend = $db->query("
SELECT DISTINCT username
FROM wux_usersteams_tbl
WHERE code = '".$team."'
");
if($emailtosend !== false) {
while($result = $db->fetch_assoc($emailtosend)) {
$emails[] = $result;
}
$db->free_result();
}
foreach($emails as $id => $email);
$cnt = 0;
if ($lang == 'pt'){
$db->actionQuery("
INSERT INTO wux_email_cron_tbl (email_id,ref_doc,ref_number,email_addresses,sender_name,
cc,bcc,subject,message_text,sent,attachment_path,created_by,creation_date)
VALUES 
(".$emails.",
'000',
0,
'".$emails[$cnt]["username"]."',
'Carta de Crédito',
'',
'',
'Carta de Crédito',
'<p>O CLIENTE ".$client_name." ENVIOU UMA NOVA CARTA DE CRÉDITO (DRAFT DO SWIFT) RELACIONADA AO RFQ Nº ".$id_rfq." PARA ANÁLISE E APROVAÇÃO DA TRADING.</p>',
0,
'',
'".$from."',
date('now')) 
");

}else{
$db->actionQuery("
INSERT INTO wux_email_cron_tbl (email_id,ref_doc,ref_number,email_addresses,sender_name,
cc,bcc,subject,message_text,sent,attachment_path,created_by,creation_date)
VALUES
(".$emails.",
'000',
0,
'".$emails[$cnt]["username"]."',
'Carta de Crédito',
'',
'',
'CREDIT LETTER FILE',
'<p>The Client ".$client_name." SEND A NEW CREDIT LETTER FILE (DRAFT DO SWIFT) RELATED TO RFQ NO ".$id_rfq." TO ANALISE AND APPROVAL TRADING.</p>',
0,
'',
'".$from."',
date('now'))
");
}
$cnt++;
$id_email++;

问题是foreach行末尾的;

foreach($emails as $id => $email);

这是在一个空的身体里循环。其余的代码不在循环中。这也意味着您将执行使用$emails[$cnt]的代码,即使$emails为空。这将导致Undefined offset错误。

您的代码也可以简化。对于所插入的某些值的语言,两个INSERT查询是相同的execpt。使用这些变量,这样就不必重复所有的查询代码。$lang在循环内部也不会发生变化,因此您可以在循环之前设置这些变量一次,而不是每次都测试它。

由于您只从表中选择一列,因此可以将该值放入$emails数组,而不是将整行放入数组。

要使用AUTO_INCREMENTemail_id,应该指定NULL作为要插入的值,而不是$emails

$emails = array();
$emailtosend = $db->query("
SELECT DISTINCT username
FROM wux_usersteams_tbl
WHERE code = '".$team."'
");
if($emailtosend !== false) {
while($result = $db->fetch_assoc($emailtosend)) {
$emails[] = $result['username'];
}
$db->free_result();
}
if ($lang == 'pt'){
$message = '<p>O CLIENTE ".$client_name." ENVIOU UMA NOVA CARTA DE CRÉDITO (DRAFT DO SWIFT) RELACIONADA AO RFQ Nº ".$id_rfq." PARA ANÁLISE E APROVAÇÃO DA TRADING.</p>';
$subject = 'Carta de Crédito';
} else {
$message = '<p>The Client ".$client_name." SEND A NEW CREDIT LETTER FILE (DRAFT DO SWIFT) RELATED TO RFQ NO ".$id_rfq." TO ANALISE AND APPROVAL TRADING.</p>';
$subject = 'CREDIT LETTER FILE';
}
foreach($emails as $email) {
$db->actionQuery("
INSERT INTO wux_email_cron_tbl (email_id,ref_doc,ref_number,email_addresses,sender_name,
cc,bcc,subject,message_text,sent,attachment_path,created_by,creation_date)
VALUES 
(NULL,
'000',
0,
'".$email"',
'Carta de Crédito',
'',
'',
'".$subject."',
'".$message."',
0,
'',
'".$from."',
date('now')) 
");
}

理想情况下,应该使用准备好的语句,而不是串联字符串。但由于您使用的是自己的数据库类,我不知道它是否支持这一点,所以我无法展示如何做到这一点

实际上,你根本不需要循环。可以使用SELECT查询作为INSERT的行源。所以整个事情可以简化为:

if ($lang == 'pt'){
$message = '<p>O CLIENTE ".$client_name." ENVIOU UMA NOVA CARTA DE CRÉDITO (DRAFT DO SWIFT) RELACIONADA AO RFQ Nº ".$id_rfq." PARA ANÁLISE E APROVAÇÃO DA TRADING.</p>';
$subject = 'Carta de Crédito';
} else {
$message = '<p>The Client ".$client_name." SEND A NEW CREDIT LETTER FILE (DRAFT DO SWIFT) RELATED TO RFQ NO ".$id_rfq." TO ANALISE AND APPROVAL TRADING.</p>';
$subject = 'CREDIT LETTER FILE';
}
$db->query("
INSERT INTO wux_email_cron_tbl (email_id,ref_doc,ref_number,email_addresses,sender_name,
cc,bcc,subject,message_text,sent,attachment_path,created_by,creation_date)
SELECT DISTINCT NULL, '000', 0, username, 'Carta de Crédito', 
'', '', '$subject', '$message', 0, '', '$from', CURRENT_DATE()
FROM wux_usersteams_tbl
WHERE code = '$team'");

最新更新