ginerjm Posted October 13, 2022 Share Posted October 13, 2022 You do realize that we have no idea where these line numbers are, yes? Braces are used to group lines of php code together. They are only needed when you have more than one line. Example: if(condition) statemtent else other statement That is how you could write a short if statement Here is a larger one: if (condition) { statement; statement; statement; } else statement; Notice how I write my code. Makes it easy to see where the braces go, yes? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601616 Share on other sites More sharing options...
rocky48 Posted October 15, 2022 Author Share Posted October 15, 2022 I think were almost there! on lines 22, 23, 24 I get this Notice: Notice: Undefined variable: POST in /homepages/30/d593365489/htdocs/MFC1066/Mac2.php on line 22 Notice: Trying to access array offset on value of type null in /homepages/30/d593365489/htdocs/MFC1066/Mac2.php on line 22 I created a Null $post ($POST=""), but then I got this for each posted variable: Warning: Illegal string offset 'fname' in /homepages/30/d593365489/htdocs/MFC1066/Mac2.php on line 23 Notice: Uninitialized string offset: 0 in /homepages/30/d593365489/htdocs/MFC1066/Mac2.php on line 23 Still nothing written to DB! Searching the web it seems that the POST's should be in an array, but how can you do that when there isn't a common variable? I looked at a simple example on the web where fruit was the variable and the array was apples, pears and oranges. Tried this: array ( $fname=$POST['fname']; $lname=$POST['lname']; $email=$POST['email']; ) But this gave the same warning! Not sure where to go from here! Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601662 Share on other sites More sharing options...
Barand Posted October 15, 2022 Share Posted October 15, 2022 Obviously, $POST should be $_POST Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601664 Share on other sites More sharing options...
mac_gyver Posted October 15, 2022 Share Posted October 15, 2022 (edited) On 10/13/2022 at 1:47 PM, rocky48 said: With so many else statements I am very confused as to where the braces should go! there shouldn't be else statements in the validation logic, unless they are for different validation steps for the same input, such as for the first name, where you should setup a specific message for each possible validation error telling the visitor what was wrong with the value they submitted. a required value that is empty, or it too long, or contains characters that are not permitted need three different error messages. validating independent/separate inputs is NOT mutually exclusive. you are to validate each input separately, storing any validation error in the $errors array using the field name as the array index. by using else statements, only the first validation error will get setup and displayed, requiring the user to resubmit the form over and over for each different validation error. also, by no longer trimming and keeping the form data as a set, in the $post array, none of the field value='...' attributes will get populated with the existing data upon an error. you are making syntax and logic changes where none is needed. Edited October 15, 2022 by mac_gyver Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601665 Share on other sites More sharing options...
mac_gyver Posted October 15, 2022 Share Posted October 15, 2022 in a copy of my original posted code, search for every place where $post exists and what related comments there are in the code. see where it is defined and initialized to an empty array? see where it is assigned a value from the array_map() call? see where elements of it are tested in the validation logic? see where elements of it are displayed in the form field value="..." attribute? do the same for the $errors variable. see where it is defined and initialized, elements of it are assigned a value in the validation logic, where it is tested after the end of the validation logic, and where it is tested and displayed in the html document? if you are not understanding and following how these two variables are being used throughout the code, you will not be able to do this activity. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601667 Share on other sites More sharing options...
rocky48 Posted October 15, 2022 Author Share Posted October 15, 2022 Sorry Barand I faithfully copied your entry on your previous post. I removed the E_NOTICE by adding '& ~ E_NOTICE' which removed any notices, but still no entries in the DB. The entry validation is not working, as I tried not entering any data to see if the message would be displayed, but they didn't! So it looks like the INSERT is not working. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601670 Share on other sites More sharing options...
rocky48 Posted October 15, 2022 Author Share Posted October 15, 2022 Looking through examples on the web I realised that the array statement syntax was wrong it should be in the format: $fname=>$_POST['fname']. It still does not populate the DB, but there are no error messages? Run out of ideas! Here's the code so far (I have not posted the html part, these are the first 44 lines): <?php // initialization session_start(); error_reporting(E_ALL & ~ E_NOTICE); ini_set('display_errors','1'); // why not have the connection code actually make the connection too, so that you don't need another line of code? require "conn/connect_seniorform.php"; // note: this code uses the much simpler and more modern PDO database extension // when you make the connection - // set the character set to match your database tables, so that no character conversion occurs over the connection // set the error mode to use exceptions, so that all the database statements will use exceptions (this is the default now in php8, but set it anyways) // set emulated prepared queries to false, you want to run real prepared queries // set the default fetch mode to assoc, so that you don't need to specify it in each fetch statement $post = []; // array to hold a trimmed working copy of the form data $errors = []; // array to hold user/validation errors // post method form processing $status=""; $POST=""; if($_SERVER["REQUEST_METHOD"]=="POST") { array($fname=>$_POST['fname'],$lname=>$_POST['lname'],$email=>$_POST['email']); if(empty($fname)|| empty($lname)|| $email){ $status="All fields are compulsory."; }elseif(strlen($fname)>= 255 || !preg_match("/^[a-zA-Z-'\s+$/", $fname)){ $status="Please enter a valid name"; }elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){ $status="Please Enter a valid email"; }else{ $sql="INSERT INTO senior_dat(fname,lname,email) VALUES (:fname, :lname, :email)"; $stmt=$pdo->prepare($sql); $stmt->execute(['fname'=>$fname], ['lname'=>$lname],['email'=>$email]); $status="Your entrys have been accepted"; $fname=""; $lname=""; $email=""; } } // hrml document starts here... ?> Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601671 Share on other sites More sharing options...
Barand Posted October 15, 2022 Share Posted October 15, 2022 Where have $fname, $lname and $email appeared from? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601672 Share on other sites More sharing options...
rocky48 Posted October 15, 2022 Author Share Posted October 15, 2022 They have been there all the time?? They are the php variables for the three form inputs I am trying to put into the database. In the array the $fname are created from the $_POST[fname] e.g. $fname=>$_POST['fname'] Is the syntax wrong? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601673 Share on other sites More sharing options...
rocky48 Posted October 15, 2022 Author Share Posted October 15, 2022 mac_gyver I have gone back to your post of 7th October and tried to follow your example. Quote <?php // initialization session_start(); error_reporting(E_ALL & ~ E_NOTICE); ini_set('display_errors','1'); // why not have the connection code actually make the connection too, so that you don't need another line of code? require "conn/connect_seniorform.php"; // note: this code uses the much simpler and more modern PDO database extension // when you make the connection - // set the character set to match your database tables, so that no character conversion occurs over the connection // set the error mode to use exceptions, so that all the database statements will use exceptions (this is the default now in php8, but set it anyways) // set emulated prepared queries to false, you want to run real prepared queries // set the default fetch mode to assoc, so that you don't need to specify it in each fetch statement $post = []; // array to hold a trimmed working copy of the form data $errors = []; // array to hold user/validation errors // post method form processing if($_SERVER["REQUEST_METHOD"]==="POST") { $fname=$_POST['fname']; $lname=$_POST['lname']; $email=$_POST['email']; $post=array_map('trim',$_POST); if($post['fname']===") { $errors['fname']= "First Name is required"; } { $errors['lname']="Last Name is required"; } { $errors['email']="Email is required"; } if(empty($errors)) { $sql="INSERT INTO senior_dat (fname,lname,email) VALUES (?,?,?)"; $stmt=$pdo->prepare($sql); try { $stmt->execute([$post['fname'], $post['lname'], $post['email']); }catch(PDOException $e){ if($e->errorInfo[1]==1062) { $errors['email']= "Email is already in use"; }else{ throw $e; } } if(empty($errors)) { $SESSION['success_message']="Form saved OK"; die(header("Refresh:0")); } ?> // html here <?php if(!empty($_SESSION['success_message'])) { echo"<p>{$_SESSION['success_message']}</p>"; unset($_SESSION['success_message']); } ?> <h1> SENIOR RENEWAL FORM</h1> <?php if(!empty($errors)) { echo'<p>';echo implode('<br>',$errors);echo''</p>; } <form method="post" <label><b>First Name: </b><br><input type="text" name="fname" size="20" maxlength="40" value=<?"htmlentities"($post['fname']??,ENT_QUOTES)?></label> <br> <input type="submit"value="submit" </form> ?> I get this error in line 30: $errors['fname']= "First Name is required"; Quote Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in What am I doing wrong? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601674 Share on other sites More sharing options...
Barand Posted October 15, 2022 Share Posted October 15, 2022 1 hour ago, rocky48 said: is the syntax wrong? Just a bit. => is used to define key/value pairs in an array, not for assigning values to variables. Your array isn't assigned to variable so the array definition does nothing. try changing the array creation to $data = array('fname'=>$_POST['fname'], 'lname'=>$_POST['lname'], 'email'=>$_POST['email'] ); then change the execute stement to $stmt->execute($data); Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601675 Share on other sites More sharing options...
Barand Posted October 15, 2022 Share Posted October 15, 2022 You are missing a closing quote in line 28. Look at the text colors in your posted code. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601676 Share on other sites More sharing options...
ginerjm Posted October 15, 2022 Share Posted October 15, 2022 This line if($post['fname']===") is wrong. Please look at it. Also - this block makes no sense: if($post['fname']===") { $errors['fname']= "First Name is required"; } { $errors['lname']="Last Name is required"; } { $errors['email']="Email is required"; } You start with a test on fname and produce an error message if needed. But then you produce an error message for lname and another for email but you aren't doing anything to test those values. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601677 Share on other sites More sharing options...
rocky48 Posted October 16, 2022 Author Share Posted October 16, 2022 Jinergm - Please explain! I do not have the knowledge to know how it is wrong! I must admit the single double quote looks wrong, I only copied Mac_gyver's earlier post back on the 9th October. Barand - Don't understand? it has closing quote, but doesn't have an opening quote? Tried putting a quote after the bracket, didn't think that was right! It moved the error to line 30 but I'm sure that's not the problem? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601693 Share on other sites More sharing options...
ginerjm Posted October 16, 2022 Share Posted October 16, 2022 (edited) // initialization session_start(); error_reporting(E_ALL); ini_set('display_errors','1'); require "conn/connect_seniorform.php"; $post = []; // array to hold a trimmed working copy of the form data $errors = []; // array to hold user/validation errors // post method form processing $status = ""; $POST = ""; // WHAT IS THIS VARIABLE FOR? if($_SERVER["REQUEST_METHOD"] == "POST") { $fname = $_POST['fname'], $lname = $_POST['lname'], $email = $_POST['email'] // AS I MENTIONED IN AN EARLIER REPLY YOU HAVE A PROBLEM WITH NEXT LINE. if(empty($fname) || empty($lname) || $email) $errors[] = "All fields are compulsory."; // WHAT ABOUT LAST NAME CHECK??? if(strlen($fname)>= 255 || !preg_match("/^[a-zA-Z-'\s+$/", $fname)) $errors[] = "Please enter a valid name"; if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "Please Enter a valid email"; if (count($errors) > 0) // handle the errors by resending the form back to the user and exit //*************************** // process the data now $sql = "INSERT INTO senior_dat(fname,lname,email) VALUES (:fname, :lname, :email)"; $stmt = $pdo->prepare($sql); if (!$stmt->execute(['fname'=>$fname], ['lname'=>$lname],['email'=>$email])) { echo "Insert query did not run"; exit(); } else echo "Your entries have been accepted"; } This is the latest block of your code with my personal improvements. See if you understand it. See my comments as well. Edited October 16, 2022 by ginerjm Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601694 Share on other sites More sharing options...
ginerjm Posted October 16, 2022 Share Posted October 16, 2022 Swap in this line if (!$stmt->execute(['fname'=>$fname, 'lname'=>$lname,'email'=>$email])) into my last. The array def was incorrect as I copied it from your code. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601695 Share on other sites More sharing options...
rocky48 Posted October 17, 2022 Author Share Posted October 17, 2022 Hi ginerjm Tried your code but it fails on this line: $fname = $_POST['fname'], Error: Parse error: syntax error, unexpected ',' in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php on line 17 I wondered if the comma's should have been semi colons, but changing that caused other errors. Did the code run for you on your computer? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601707 Share on other sites More sharing options...
ginerjm Posted October 17, 2022 Share Posted October 17, 2022 And you really can't debug it? My bad - I altered your code and didn't replace the commas there with semis. But the fact that you can't debug this tells me that you are not very knowledgeable in PHP.... These are simple assignment statements and every php statement ends with a semi. The error message points right at the offending comma. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601711 Share on other sites More sharing options...
rocky48 Posted October 17, 2022 Author Share Posted October 17, 2022 I know that you use semi colons at the of some statements. I was not sure if it was part of an if statement that these lines were meant to have comas. I had tried adding semi colons but it produced more errors. However, I persisted and made several changes and I have sort of got it working, but something is wrong as it puts a 'input>' in the first name box. As far as I can see the syntax is correct! This is the form section: ?> <h1> SENIOR RENEWAL FORM</h1> <?php if(!empty($errors)) { echo implode('<br>',$errors);echo''; } ?> <form method="post" <label <b>First Name: </b><br></label><input type="text" name="fname" size="20" maxlength="40" value=<?php "htmlentities"($post['fname']?? ENT_QUOTES)?> <input type="submit" value="Submit"> </form> </html> The ?> is after the last line that you sent me. I tried entering my name in the input box and got a string of errors: Quote Notice: Undefined index: lname in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php on line 21 Notice: Undefined index: email in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php on line 22 Warning: preg_match(): Compilation failed: missing terminating ] for character class at offset 14 in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php on line 27 Notice: Undefined variable: pdo in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php on line 37 Fatal error: Uncaught Error: Call to a member function prepare() on null in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php:37 Stack trace: #0 {main} thrown in /homepages/30/d593365489/htdocs/MFC1066/senior_data2.php on line 37 I got rid of the notices, but were left with the preg_match and the Fatal Error. Can you offer any more help? Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601714 Share on other sites More sharing options...
dodgeitorelse3 Posted October 17, 2022 Share Posted October 17, 2022 (edited) <label Needs closing > Also $post['fname'] Should be $_post['fname'] Edited October 17, 2022 by dodgeitorelse3 Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601715 Share on other sites More sharing options...
ginerjm Posted October 17, 2022 Share Posted October 17, 2022 I think I'm gonna quit on you. You just don't understand that you can't post stuff without SHOWING us what it relates to . I've asked already to show us the code with the error lines indicated but you won't do it. And you are trying to do this project that you apparently are not ready to accomplish. (if you don't know where a semi goes you have a lot to learn.) Good luck on your journey. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601719 Share on other sites More sharing options...
rocky48 Posted October 20, 2022 Author Share Posted October 20, 2022 I have now corrected the problems in the form, but have a problem in the prepare statement: Fatal error: Uncaught Error: Call to a member function prepare() on null in ... Here is the line: $stmt = $pdo->prepare($sql); My research on the web says that the pdo is not initialised, but the example initialises it when it logs in to the database. I have connected to the database using require using the following code: <?php $host_name = 'xxxxxxxx'; $database = 'xxxxxx'; $user_name = 'xxxxxxxxxx'; $password = 'xxxxxxxxx'; $link = new mysqli($host_name, $user_name, $password, $database); if ($link->connect_error) { die('<p>Failed to connect to MySQL: '. $link->connect_error .'</p>'); } else { echo '<p>Connection to MySQL server successfully established.</p>'; } ?> But I have used mysqli, so is the the reason that it fails with this error? I have not used PDO before this project, so am not sure if I need to change the connection code. Will it work if I change the connection code that I require at the beginning of the script or is it better to put the PDO connection code at the top of main code? Here is the complete code for my form entry to the database: <!DOCTYPE html> <html> <?php // initialization session_start(); error_reporting (E_ALL ^ E_NOTICE); ini_set('display_errors','1'); require "conn/connect_seniorform.php"; $post = []; // array to hold a trimmed working copy of the form data $errors = []; // array to hold user/validation errors // post method form processing $status = ""; if($_SERVER["REQUEST_METHOD"] == "POST") { $fname = $_POST['fname']; $lname = $_POST['lname']; $email = $_POST['email']; if(empty($fname) || empty($lname) || $email) $errors[] = "All fields are compulsory."; // WHAT ABOUT LAST NAME CHECK??? if(strlen($fname)>= 255 || !preg_match("/^a-zA-Z-'\s+$/", $fname)) $errors[] = "Please enter a valid name"; if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "Please Enter a valid email"; if (count($errors) > 0) // handle the errors by resending the form back to the user and exit //*************************** // process the data now $sql = "INSERT INTO senior_dat(fname,lname,email) VALUES (:fname, :lname, :email)"; $stmt = $pdo->prepare($sql); if (!$stmt->execute(['fname'=>$fname, 'lname'=>$lname,'email'=>$email])) { echo "Insert query did not run"; exit(); } else echo "Your entries have been accepted"; } ?> <h1>SENIOR RENEWAL FORM</h1> <?php // display any errors if(!empty($errors)) { echo '<p>'; echo implode('<br>',$errors); echo '</p>'; } ?> <form method="post"> <label><b>First Name:</b><br><input type="text" name="first_name" size="20" maxlength="40" value="<?=htmlentities($_POST['first_name']??'',ENT_QUOTES)?>"></label> <br> <input type="submit" value="submit"> </form> </html> Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601810 Share on other sites More sharing options...
Barand Posted October 20, 2022 Share Posted October 20, 2022 You have created a dataase connection called "$link" but you are using one called "$pdo" However just changing $pdo to $link won't work as your statement syntax and execute call are PDO only. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601812 Share on other sites More sharing options...
mac_gyver Posted October 20, 2022 Share Posted October 20, 2022 On 10/7/2022 at 11:15 AM, mac_gyver said: // note: this code uses the much simpler and more modern PDO database extension // when you make the connection - // set the character set to match your database tables, so that no character conversion occurs over the connection // set the error mode to use exceptions, so that all the database statements will use exceptions (this is the default now in php8, but set it anyways) // set emulated prepared queries to false, you want to run real prepared queries // set the default fetch mode to assoc, so that you don't need to specify it in each fetch statement you are deleting the comments without even reading and understanding what they say. Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601815 Share on other sites More sharing options...
rocky48 Posted October 20, 2022 Author Share Posted October 20, 2022 Barand - So should I change the connection code to PDO instead of mysqli? As I keep saying I have not used PDO before and previous databases I have written were non pdo. I have had a go at changing the connection code, but get this error: Parse error: syntax error, unexpected ':', expecting ')' in /homepages/30/d593365489/htdocs/MFC1066/conn/connect_seniorform.php on line 7 Line 7: $pdo = new PDO(mysql:host='dbxxxxxxx.hosting-data.io;dbname=dbsxxxxxxx', $user, $pass); I have used this example from the PHP documentation: $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); I can't see that there is anything wrong with my modification? It suggests that the colon should be a closing bracket?? Could it be caused elsewhere in the code. I have attached the full code: <?php $host_name = 'dbxxxxxxx.hosting-data.io'; $dbname = 'dbsxxxxxx'; $user = 'dbuxxxxx'; $pass = 'xxxxxxxxx'; $pdo = new PDO(mysql:host='db5010240626.hosting-data.io;dbname=dbs8678517', $user, $pass); if ($pdo->connect_error) { die('<p>Failed to connect to MySQL: '. $pdo->connect_error .'</p>'); } else { echo '<p>Connection to MySQL server successfully established.</p>'; } ?> Quote Link to comment https://forums.phpfreaks.com/topic/315403-saving-to-mysql-database-not-working/page/2/#findComment-1601819 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.