greenace92 Posted December 28, 2014 Share Posted December 28, 2014 (edited) First, I'd like to apologize for my behavior, I didn't really "do anything wrong per se" I just get impulsive sometimes haha bad start I am so close to finishing this website, which I will use to sell myself as a person who fixes computers I am stuck on this problem, for all the pages Either I can error check but data is not recorded in the tables Or the error checking works but data is not recorded The problem seems to be "triggered" by removing $errors[]=""; Also I'd like to say hello to QuickOldCar Anyway here is the php parts of a single web page, this problem is shared on all of them except the index page which has successful error checking, session data retrieval and redirecting / updating data I've spent days trying to fix this amongst other things (pretty sad right) this is literally one of the final problems to be solved before I'm ready to get his website indexed / advertise it Thanks for any help <?php ob_start(); session_start(); global $nameErr,$emailErr,$commentsErr,$hourErr,$minuteErr; global $name,$comments,$email,$hour,$minute; mysqli_report(MYSQLI_REPORT_ALL); error_reporting(E_ALL); error_reporting(-1); function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } $servername = "localhost"; $username = " "; $password = " "; $dbname = " "; global $link; $link = new mysqli("$servername", "$username", "$password", "$dbname"); if($_SERVER['REQUEST_METHOD']=='POST'){ $errors = array(); if (empty($_POST["name"])) { $nameErr = "Name is required"; } else { $name = test_input($_POST["name"]); // check if name only contains letters and whitespace if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "The form of the name entered is not acceptable"; } } if (empty($_POST["email"])) { $emailErr = "An email is required"; } else { $email = test_input($_POST["email"]); } if (empty($_POST["comments"])) { $commentsErr = "A comment is required."; } else { $comments = test_input($_POST["comments"]); // check if name only contains letters and whitespace } $test = $_POST['hour']; $test1 = '$test'; if (empty($_POST['hour'])) { $hourErr = "Please specify an hour between 12 and 8"; } else { if (ctype_digit($_POST['hour'])) { $hour = test_input($_POST['hour']); }else { $hourErr = "Only numbers are allowed"; } } if (empty($_POST['minute'])) { $minuteErr = "Please specify a minute between 1 and 60"; } else { if (ctype_digit($_POST['minute'])) { $minute = test_input($_POST['minute']); } else { $minuteErr = "Only numbers are allowed"; } } if(empty($errors)){ $link = new mysqli("$servername", "$username", "$password", "$dbname"); $name = test_input($_POST['name']); $email = test_input($_POST['email']); $comments = test_input($_POST['comments']); $hour = test_input($_POST['hour']); $minute = test_input($_POST['minute']); // use the submitted data here... insert into database, send email, ... $stmt = mysqli_prepare($link, "INSERT INTO Dropoff VALUES (?,?,?,?,?)"); $stmt->bind_param('sssii',$name,$email,$comments,$hour,$minute); $stmt->execute(); $to = ' '; $subject = 'Dropoff scheduled'; $message = "Check the database"; $message = wordwrap($message,70,"\r\n"); $headers = 'From: service@jakes-bytes.us'."\r\n\r\n"; mail($to,$subject,$message,$headers); $to = $email; $subject = 'Jakes Bytes Your Dropoff Has Been Scheduled'; $message = "Thank you for choosing Jakes Bytes computer repair shop.\r\n\r\nAttached is the information you have sent.\r\n\r\n \r\n\r\nBelow is our address. Look for the Greek letters on our building.\r\n\r\nJake's Bytes is a private business. Please call upon arrival.\r\n\r\nThank you.\r\n\r\n169 Highgate Ave. Buffalo, NY 14215\r\n\r\nJake's Bytes is a property of Normalbus"; $message = wordwrap($message,70,"\r\n"); $headers = 'From: '."\r\n\r\n"; mail($to,$subject,$message,$headers); // set up a status message to be displayed one time $_SESSION['status_message'] = "Drop off scheduled successfully"; // after successfully processing any post form data, redirect to the same exact url of this page to clear the post data $host = $_SERVER['HTTP_HOST']; $uri = $_SERVER['REQUEST_URI']; // the path/file?query string of the page header("Location: http://$host$uri"); exit; $link->close(); } } ?> <HTML> <html break> <?php if(!empty($errors)){ foreach($errors as $error){ echo '<span style="color: red">'.htmlspecialchars($error).'</span>'.'</br>'.'</br>'; } } if(isset($_SESSION['status_message'])){ echo '<span style="color: #ccfb5d">'.htmlspecialchars($_SESSION['status_message']).'</span>'.'</br>'.'</br>'; unset($_SESSION['status_message']); // clear the message } ?> <html resume> </html> Awe it's too bad the code paste box doesn't have highlighting, I've been spending time at other PHP forums and codingforums uses highlighting which is very helpful Edited December 28, 2014 by mac_gyver link removed Quote Link to comment Share on other sites More sharing options...
NotionCommotion Posted December 28, 2014 Share Posted December 28, 2014 $nameErr = "The form of the name entered is not acceptable"; along with all your other errors needs to be changed to $errors[]= "The form of the name entered is not acceptable"; Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted December 28, 2014 Share Posted December 28, 2014 Hello to you as well. If are storing errors in $errors array you can just add to it something like this $errors = array(); if (empty($_POST["name"])) { $errors['name'] = "Name is required"; } else { $name = test_input($_POST["name"]); // check if name only contains letters and whitespace if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $errors['name'] = "The form of the name entered is not acceptable"; } } Quote Link to comment Share on other sites More sharing options...
NotionCommotion Posted December 28, 2014 Share Posted December 28, 2014 Agree with QuickOldCar, but I wouldn't use associated arrays. Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted December 28, 2014 Share Posted December 28, 2014 Or hold all the errors into a single array as NotionCommotion did. It depends if want to do specific checks on the errors or just show something Quote Link to comment Share on other sites More sharing options...
NotionCommotion Posted December 28, 2014 Share Posted December 28, 2014 Ha ha, beat you twice in a row Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted December 28, 2014 Share Posted December 28, 2014 Must be my slow internet or the site, ha ha. Quote Link to comment Share on other sites More sharing options...
greenace92 Posted December 28, 2014 Author Share Posted December 28, 2014 (edited) $nameErr = "The form of the name entered is not acceptable"; along with all your other errors needs to be changed to $errors[]= "The form of the name entered is not acceptable"; I don't understand what you mean? How would the errors be identified individually? Oh wait... nevermind I understand, I wonder why that is? I followed w3schools, which funny enough another website calls them "W3Fools" eg. don't use that site This is pulled from their example here $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "Name is required"; } else { $name = test_input($_POST["name"]); // check if name only contains letters and whitespace if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "Only letters and white space allowed"; } } I need to show individual errors Also thank you for the fast responses See it works here (attached image) but again it doesn't post, just refreshes the page p.s. Hello QuickOldCar happy to hear from you Edited December 28, 2014 by greenace92 Quote Link to comment Share on other sites More sharing options...
QuickOldCar Posted December 28, 2014 Share Posted December 28, 2014 I suppose showing the form code would have helped. if(empty($errors)){ //process script } else { //show form, show errors or can add these php snippets into form to show errors if(isset($errors['name'])){ echo $errors['name'],"<br />"; } } Quote Link to comment Share on other sites More sharing options...
greenace92 Posted December 28, 2014 Author Share Posted December 28, 2014 Sorry for the confusion, that image is not for the code above, I was just trying to clarify what I was looking to achieve. The form is always there, if you hit submit without filling in the fields, the errors should appear. I have these lines <?php echo $errors['hour'];?> next to an hour field for example, now I get error messages that say "undefined variable $errors" wherever I try to echo the error I don't understand how I would identify an error without specifying it That's what I don't get about the first response by NotionCommotion $nameErr = "The form of the name entered is not acceptable"; along with all your other errors needs to be changed to $errors[]= "The form of the name entered is not acceptable"; I need to tell a person what part is incorrect and excuse me if that is what NotionCommotion just showed me Quote Link to comment Share on other sites More sharing options...
greenace92 Posted December 28, 2014 Author Share Posted December 28, 2014 Alright so the problem has been solved thanks to both of your suggestions however it does not work properly When I declare the $errors[]=""; so that they are not undefined, these take up space, pushing down my fields, what is up with that? Also when I purposely leave the fields blank, there are double errors displayed... Where would I put the empty variables? So that they aren't shown eg. take up space but also are not executed until post? See the actual image of this example This is great, it's so frustrating to go nowhere you know? Like smashing your head into a brick wall over and over... the difference seems insignificant like "oh look at that, it actually worked" but it is a great feeling Thanks for the help Quote Link to comment Share on other sites More sharing options...
NotionCommotion Posted December 28, 2014 Share Posted December 28, 2014 Your original script at the end just displays the errors as a group. Note that this is typically how I do it. I agree that error prompts at the individual fields are nice, and I use jQuery validation plugin for client "nice" validation before validating serverside, so most people don't see the list of errors. if(!empty($errors)){ foreach($errors as $error){ echo '<span style="color: red">'.htmlspecialchars($error).'</span>'.'</br>'.'</br>'; } } As for as $errors[]=""; goes, you shouldn't be doing this. Doing so just adds another element to the array. Even though PHP doesn't require, I always define an empty array using $errors=array(); before adding elements to it. Get to know and appreciate var_dump(). Or, if you prefer (I often do), use the following: echo('<pre>'.print_r($errors,1).'</pre>'); Quote Link to comment Share on other sites More sharing options...
Solution greenace92 Posted December 28, 2014 Author Solution Share Posted December 28, 2014 Oh my GOD!!! WOOOOOOOOOOOOO He hath risen! Thank you guys, very much. Glad I overcame my ego... The solution was to declare $errors as a global variable at the top, then using $errors['name']="something"; I could echo them in the right location using <?php echo $errors['name'] ;?> Also this is redundant if(!empty($errors)){ foreach($errors as $error){ echo '<span style="color: red">'.htmlspecialchars($error).'</span>'.'</br>'.'</br>'; } } Boom! Case closed... bring the cows home Quote Link to comment Share on other sites More sharing options...
mac_gyver Posted December 28, 2014 Share Posted December 28, 2014 (edited) I have these lines <?php echo $errors['hour'];?> next to an hour field for example, now I get error messages that say "undefined variable $errors" wherever I try to echo the error someone in the other php help forum showed how to reference the associative error array elements so that they won't produce php errors if the validation error isn't set - <?php if(isset($errors['name'])){ echo $errors['name']; } ?> someone in the other php help forum even went to the trouble of taking the page layout you were shown and posted a working example using it, setting associative error array messages and displaying the errors next to each form field they apply to. When I declare the $errors[]=""; why do you even have that line in your code? it wasn't in the original page layout you were shown. The solution was to declare $errors as a global variable at the top i'm pretty sure that someone else in the other help forum mentioned that the global keyword, the way you are using it, doesn't do anything (and in the case where it does do something, inside of a function definition, it shouldn't be used as it results in spaghetti code.) edit: lastly, why do you have an ob_start() statement in your code? all that typically results in hiding problems in code and messes with output your script tries to display. Edited December 28, 2014 by mac_gyver more info Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.