PHP表单空提交触发implode()函数无效参数报错求助
解决implode()函数参数无效的报错问题
提交未填写任何字段的表单时,触发如下警告:
Warning: implode(): Invalid arguments passed in /var/www/xxxxx.com/contact.php on line 35
报错源于第35行对implode()函数的调用,相关PHP代码如下:
<?php $your_email ='email@gmail.com';// <<=== update to your email address session_start(); $errors = ''; $name = ''; $lastname = ''; $phone = ''; $address = ''; $zipcode = ''; $city = ''; $state = ''; $interested_in = array(); $interested_in = ''; $visitor_email = ''; $user_message = ''; $ansday = ''; $hidansday=''; $qnday=rand(1,7); $hidansday=$qnday+1; if($hidansday==8) {$hidansday=1;} $whatday=jddayofweek ( cal_to_jd(CAL_GREGORIAN, 1,$qnday, 2012) , 1 ); if(isset($_POST['submit'])) { $name = $_POST['name']; $lastname = $_POST['lastname']; $phone = $_POST['phone']; $address = $_POST['address']; $zipcode = $_POST['zipcode']; $city = $_POST['city']; $state = $_POST['state']; $interested_in = implode(",", $_POST['interested_in']); $visitor_email = $_POST['visitor_email']; $user_message = $_POST['message']; $hiddenansday= $_POST['hidansday']; $ansday = $_POST['ansday']; $dw1=trim(strtolower($ansday)); $dw2=strtolower(trim(jddayofweek (cal_to_jd(CAL_GREGORIAN, 1,$hiddenansday, 2012) , 1 ))); ///------------Do Validations------------- $email = htmlspecialchars($_POST['visitor_email']); if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$visitor_email)) { $errors .= "\n E-mail address not valid "; } if ($dw1!==$dw2) { $errors .= "\n Please enter valid day for the Security Question"; } if(empty($name)) { $errors .= "\n First Name is a required field. "; } if(empty($address)) { $errors .= "\n Please enter your address. "; } if(empty($zipcode)) { $errors .= "\n Please enter your ZIP Code. "; } if(empty($city)) { $errors .= "\n Please enter your City. "; } if(empty($state)) { $errors .= "\n Please enter your State. "; } if( !preg_match("/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/i", $phone) ) { $errors .= "\n Please enter a valid phone number "; } if(empty($errors)) { //send the email $to = $your_email; $subject="Web Form"; $from = $visitor_email; $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; $body = "A user $name submitted the contact form: ". "First Name: $name ". "Last Name: $lastname ". "Phone: $phone ". "Email: $visitor_email ". "Address: $address ". "Zip Code: $zipcode ". "City: $city ". "State: $state ". "Interested In (Check all that apply): $interested_in ". "Message: ". "$user_message ". "IP: $ip "; $headers = "From: $from \r\n"; $headers .= "Reply-To: $visitor_email \r\n"; mail($to, $subject, $body,$headers); header('Location: thankyou.php'); } } ?>
对应的HTML表单代码:
<p> Service Interested In <small>(Check all that apply):</small> <br/> <input name="interested_in[]" type="checkbox" id="interested_in1" value="Internet"/> Internet<br> <input name="interested_in[]" type="checkbox" id="interested_in2" value="Telephone" /> Telephone<br> <input name="interested_in[]" type="checkbox" id="interested_in3" value="Key System" /> Key Systems<br> </p>
问题原因
当没有勾选任何interested_in复选框时,该字段不会被包含在$_POST数组中,直接调用implode(",", $_POST['interested_in'])会因为传入的参数不是数组而触发警告。此外,代码开头对$interested_in先赋值数组再覆盖为空字符串的操作完全多余。
解决方案
修改第35行的代码,先判断$_POST['interested_in']是否存在且为数组,再执行implode操作:
方案一:使用三元运算符简化代码
$interested_in = isset($_POST['interested_in']) && is_array($_POST['interested_in']) ? implode(",", $_POST['interested_in']) : '';
方案二:使用条件判断处理
$interested_in = ''; if(isset($_POST['interested_in']) && is_array($_POST['interested_in'])){ $interested_in = implode(",", $_POST['interested_in']); }
同时,建议删除代码开头的冗余赋值:
// 移除以下两行 $interested_in = array(); $interested_in = ''; // 替换为 $interested_in = '';
修改后,无论用户是否勾选复选框,$interested_in都会被赋值为合法的字符串,不会触发implode函数的警告。
内容的提问来源于stack exchange,提问作者Sarobar
相关产品推荐
相关产品推荐

