phpchick Posted May 5, 2011 Share Posted May 5, 2011 Hi, I currently have an if, elseif, else program that starts off with if( $v_name == "" || $v_msg == "" ) echo "something" how do I turn this into a switch? but the very next elseif I have elseif( strcspn( $_REQUEST['msg'], '0123456789' ) == strlen( $_REQUEST['msg'] ) ) echo "something" is it possible to turn this into a switch with 2 different strings like that to evaluate? Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/ Share on other sites More sharing options...
requinix Posted May 5, 2011 Share Posted May 5, 2011 Yes. But why? Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210748 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 because there will be a lot of conditions that I want to check through and with nested if statements it will be too confusing. I am building a signup form for a website. if a person enters an invalid password or email, it must say "you must enter a valid email and password" if there is no number, it must display "you must use at least a number. if there is no special character, it must display "you must use at least 1 special character" if there is less than 8 characters, it must display "you must enter at least 8 characters" if there is no capital letters, it must display "At least one letter must be capitalized" Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210754 Share on other sites More sharing options...
marcus Posted May 5, 2011 Share Posted May 5, 2011 Don't nest them then. Just do all the error checking in separate statements. Something like this: <?php $error = false; $erros = array(); if(invalidEmail($email)){ $error = true; $errors[] = "Invalid email address"; } if(strlen($postedText) < { $error = true; $errors[] = "Must be 8 or more characters"; } // etc... if($error){ // handle errors here foreach($errors AS $singleError){ echo $singleError . "<br />\n"; } }else { // no errors caught // perform needed task } ?> Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210757 Share on other sites More sharing options...
Pikachu2000 Posted May 5, 2011 Share Posted May 5, 2011 That is truly a bad way of validating data and presenting errors. You should perform ALL validations at the same time, and present ALL error messages to the user, along with redisplaying the form with their previous entries pre-populated in the fields. Here's my stock 'example' form. Paste it in to a new script, and study how it works. It should give you some ideas on form error handling, storing errors in arrays and adding some field styling in response to validation results. <?php if( isset($_POST['submitted']) && $_POST['submitted'] == 'yes' ) { //check for hidden field value to indicate form has been submitted $errors = array(); // initialize an array to hold validation errors $_POST = array_map('trim', $_POST); // trim all $_POST array values if( !empty($_POST['name']) ) { // validate the name field if( !ctype_alpha($_POST['name']) ) { $errors['name'][] = 'Name must be alphabetic characters only.'; // if name has non alpha chars, store error } if( strlen($_POST['name']) < 3 || strlen($_POST['name'] > 20) ) { $errors['name'][] = 'Name must be from 3 to 20 characters.'; // if name has too many/few chars, store error } } else { $errors['name'][] = 'Name is a required field.'; // if name is empty, store error } if( !empty($_POST['number']) ) { // same validations as in name, above. if( !ctype_digit($_POST['number']) ) { $errors['number'][] = 'Number must be numeric.'; } if( strlen($_POST['number']) < 5 || strlen($_POST['number']) > 10 ) { $error = 'Number must be from 3 to 20 digits. It is currently ' . strlen($_POST['number']) . ' digit'; $error .= strlen($_POST['number']) == 1 ? '.' : 's.'; $errors['number'][] = $error; } } else { $errors['number'][] = 'Number is a required field.'; } if( !empty($errors) ) { // if the $errors array is not empty, display the errors to allow the user to correct them and resubmit the form $echo = array(); foreach( $errors as $v ) { if( is_array($v) ) { $echo[] = implode('<br>', $v ); } else { $echo[] = $v; } } $err_echo ="<font color=\"red\">The following errors were detected:<br>"; $err_echo .= implode("<br>\n", $echo); $err_echo .= '</font>'; } } if( (isset($_POST['submitted']) && !empty($errors)) || !isset($_POST['submitted']) ) { ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <style type="text/css" media="screen"> body { font-family: helvetica, arial, sans-serif; font-size: 0.85em; line-height: 1.25em; letter-spacing: -0.5px; } input { border: 1px solid #336699; padding: 0.1em; margin: 5px; color: #113366; } input.error { background-color: #F2BDCA; color: #850310; border: 1px solid red; } input.good { background-color: #D3F5D3; border: 1px solid #156B15; color: #156B15; } input.submit { background-color: #CCCCCC; border: 1px solid #888888; color: #333333; padding: 2px; margin: 0; font: 0.9em helvetica, arial sans-serif; } </style> <title> Work In Progress</title> </head> <body> <?php echo !empty($err_echo) ? $err_echo : ''; ?> <form method="post" action=""> Name (3-20 letters): <input type="text" class="<?php if( isset($_POST['submitted']) ) { echo !empty($errors['name']) ? 'error' : 'good'; } ?>" name="name" value="<?php echo isset($_POST['name']) ? $_POST['name'] : ''; ?>"> <br> Number (5-10 numbers): <input type="text" class="<?php if( isset($_POST['submitted']) ) { echo !empty($errors['number']) ? 'error' : 'good'; } ?>" name="number" value="<?php echo isset($_POST['number']) ? $_POST['number'] : ''; ?>"> <br> <input type="hidden" name="submitted" value="yes"> <input class="submit" type="submit" name="submit" value=" <?php echo !empty($errors) ? 'Re-Submit' : 'Submit'; ?> "> </form> <?php } else { // Form was submitted, and validated with no errors. OK to run db insert, display success message, etc. echo "Successful submission!"; } ?> </body> </html> Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210758 Share on other sites More sharing options...
vicodin Posted May 5, 2011 Share Posted May 5, 2011 No a switch statement is to compare 1 variable... So like lets say we had variables $x,$y,$z the code would go as follows: switch($x){ case "": //if $x == "" then do this: echo 'Its blank'; break; case "1": //if $x == "1" then do this: echo "It says 1"; break; case "2": //If $x == "2" then do this: echo "ITs says 2"; break; } A switch only allows us to compare variable $x to what ever is in our cases.... So you would need to make 3 different switch statements and then do an If statement anyway to see if they matched what you needed. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210760 Share on other sites More sharing options...
phpSensei Posted May 5, 2011 Share Posted May 5, 2011 That is truly a bad way of validating data and presenting errors. You should perform ALL validations at the same time, and present ALL error messages to the user, along with redisplaying the form with their previous entries pre-populated in the fields. Here's my stock 'example' form. Paste it in to a new script, and study how it works. It should give you some ideas on form error handling, storing errors in arrays and adding some field styling in response to validation results. <?php if( isset($_POST['submitted']) && $_POST['submitted'] == 'yes' ) { //check for hidden field value to indicate form has been submitted $errors = array(); // initialize an array to hold validation errors $_POST = array_map('trim', $_POST); // trim all $_POST array values if( !empty($_POST['name']) ) { // validate the name field if( !ctype_alpha($_POST['name']) ) { $errors['name'][] = 'Name must be alphabetic characters only.'; // if name has non alpha chars, store error } if( strlen($_POST['name']) < 3 || strlen($_POST['name'] > 20) ) { $errors['name'][] = 'Name must be from 3 to 20 characters.'; // if name has too many/few chars, store error } } else { $errors['name'][] = 'Name is a required field.'; // if name is empty, store error } if( !empty($_POST['number']) ) { // same validations as in name, above. if( !ctype_digit($_POST['number']) ) { $errors['number'][] = 'Number must be numeric.'; } if( strlen($_POST['number']) < 5 || strlen($_POST['number']) > 10 ) { $error = 'Number must be from 3 to 20 digits. It is currently ' . strlen($_POST['number']) . ' digit'; $error .= strlen($_POST['number']) == 1 ? '.' : 's.'; $errors['number'][] = $error; } } else { $errors['number'][] = 'Number is a required field.'; } if( !empty($errors) ) { // if the $errors array is not empty, display the errors to allow the user to correct them and resubmit the form $echo = array(); foreach( $errors as $v ) { if( is_array($v) ) { $echo[] = implode('<br>', $v ); } else { $echo[] = $v; } } $err_echo ="<font color=\"red\">The following errors were detected:<br>"; $err_echo .= implode("<br>\n", $echo); $err_echo .= '</font>'; } } if( (isset($_POST['submitted']) && !empty($errors)) || !isset($_POST['submitted']) ) { ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <style type="text/css" media="screen"> body { font-family: helvetica, arial, sans-serif; font-size: 0.85em; line-height: 1.25em; letter-spacing: -0.5px; } input { border: 1px solid #336699; padding: 0.1em; margin: 5px; color: #113366; } input.error { background-color: #F2BDCA; color: #850310; border: 1px solid red; } input.good { background-color: #D3F5D3; border: 1px solid #156B15; color: #156B15; } input.submit { background-color: #CCCCCC; border: 1px solid #888888; color: #333333; padding: 2px; margin: 0; font: 0.9em helvetica, arial sans-serif; } </style> <title> Work In Progress</title> </head> <body> <?php echo !empty($err_echo) ? $err_echo : ''; ?> <form method="post" action=""> Name (3-20 letters): <input type="text" class="<?php if( isset($_POST['submitted']) ) { echo !empty($errors['name']) ? 'error' : 'good'; } ?>" name="name" value="<?php echo isset($_POST['name']) ? $_POST['name'] : ''; ?>"> <br> Number (5-10 numbers): <input type="text" class="<?php if( isset($_POST['submitted']) ) { echo !empty($errors['number']) ? 'error' : 'good'; } ?>" name="number" value="<?php echo isset($_POST['number']) ? $_POST['number'] : ''; ?>"> <br> <input type="hidden" name="submitted" value="yes"> <input class="submit" type="submit" name="submit" value=" <?php echo !empty($errors) ? 'Re-Submit' : 'Submit'; ?> "> </form> <?php } else { // Form was submitted, and validated with no errors. OK to run db insert, display success message, etc. echo "Successful submission!"; } ?> </body> </html> is_numeric performs faster results than ctype.. but i guess ctype checks if its purely digits only. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210762 Share on other sites More sharing options...
Pikachu2000 Posted May 5, 2011 Share Posted May 5, 2011 Right, is_numeric() will return TRUE for values such as 12E456, 0xFA94BC, decimals/floats etc., so if all that is to be allowed is numeric (0-9) characters, ctype_digit() is appropriate. It's just an example anyhow Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210766 Share on other sites More sharing options...
requinix Posted May 5, 2011 Share Posted May 5, 2011 No a switch statement is to compare 1 variable Actually it's to compare two values. Don't have to be variables. In PHP you can switch (true) { Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210768 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 I just tried the following code and got no luck. I can't display all the requirements at once because it has to go like a story, it has to be done one at a time. This time, I started the statement as a regular if/else and then nested the switch statement inside the else portion. If the password or email is invalid, echo "please enter a valid email and password" else switch($password) case $passwordhasnonumber: etc I'm not actually even sure how the switch will work in this case... if( $v_name == "" || $v_msg == "" ) { $query = "INSERT INTO contact(name,email,msg) VALUES ('$v_name','$v_email','$v_msg')"; $result = mysql_query( $query ); if( !$result ) { die( mysql_error() ); } echo <<<EOD <head> <link rel="stylesheet" type="text/css" href="http://hedgezoo.com/signup.css"> </head> <h2>Free Registration</h2> <form action="contact_insert2.php" method="POST" id="insert"> <table> <tr> <td>Email</td> <td ><input type="text" size="40" name="name"></td> </tr> <tr> <td>Password</td> <td><input type="password" size="40" name="msg" ></td> </tr> <tr> <td colspan=2 id="sub"> You must enter an email and password. <br /> <input type="submit" name="submit" value="submit"> </td> </tr> </Table> </form> EOD; } // If it DOES NOT HAVE a number else { switch($v_msg) { case strcspn( $_REQUEST['msg'], '0123456789' ) == strlen( $_REQUEST['msg'] ) $query = "INSERT INTO contact(name,email,msg) VALUES ('$v_name','$v_email','$v_msg')"; $result = mysql_query( $query ); if( !$result ) { die( mysql_error() ); } } } Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210769 Share on other sites More sharing options...
phpSensei Posted May 5, 2011 Share Posted May 5, 2011 Right, is_numeric() will return TRUE for values such as 12E456, 0xFA94BC, decimals/floats etc., so if all that is to be allowed is numeric (0-9) characters, ctype_digit() is appropriate. It's just an example anyhow Cool, you know what, I really love the array_map function, I just came back from a competition in skills and technology, it saved me alot of time, but this is kind of off topic Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210771 Share on other sites More sharing options...
Pikachu2000 Posted May 5, 2011 Share Posted May 5, 2011 Yeah array_map() is great when used properly. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210775 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 mgallforever it sounds like your solution is the easiest. In your example, it literally is doing this. if a person enters an invalid password or email, it must say "you must enter a valid email and password" if there is no number, it must display "you must use at least a number. if there is no special character, it must display "you must use at least 1 special character" if there is less than 8 characters, it must display "you must enter at least 8 characters" if there is no capital letters, it must display "At least one letter must be capitalized" I didn't even know you can do if in separate individual statements like you had it. If it doesn't satisfy the condition in the first if, it just moves on to the second one? Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210778 Share on other sites More sharing options...
Pikachu2000 Posted May 5, 2011 Share Posted May 5, 2011 Did you bother to look at or maybe even try the code I posted? It does pretty much the exact same thing. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210780 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 Did you bother to look at or maybe even try the code I posted? It does pretty much the exact same thing. I did, but I'm not very good at PHP, I'm completely new. I don't really understand a lot of what you pasted and I need to customize it (my program has to log everything into the DB even if what the user typed in doesn't satisfy requirements). Also I'm not sure how I would port it over. I guess I could do a "replace all" of your variables to mine, but I really doubt it would work knowing how bad I am with computers. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210782 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 and also, I don't want to present ALL error messages to the user. I want to do it one at a time so that the user has to retype the password everytime. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210783 Share on other sites More sharing options...
phpSensei Posted May 5, 2011 Share Posted May 5, 2011 Did you bother to look at or maybe even try the code I posted? It does pretty much the exact same thing. this. and i think the OP is wondering how the ORDER of the if/else will work.. PHPchick, If you simply do if($var ==""){ print "please enter the var 1 field" ; } if($var2 ==""){ print "please enter the var 2 field"; } if($var3 ==""){ print "please enter the var 3 field"; } Output Please enter the var 1 field Please enter the var 2 field Please enter the var 3 field it will display all 3 errors.. although if you do this method if($var == ""){ print "please enter the var 1 field"; }elseif($var2 ==""){ print "please enter the var 2 field"; } Then it will go in sequence. It will run through the entire if/elseif script, and if the one of the conditions are met, it will print that error... It will keep printing 1 error everytime as long as the conditions are met until there are no more errors... Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210785 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 PHPsensei the OP just sucks at PHP Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210787 Share on other sites More sharing options...
phpSensei Posted May 5, 2011 Share Posted May 5, 2011 PHPsensei the OP just sucks at PHP We all began somewhere, no one is born with ultimate knowledge of PHP. Your doing great btw, don't worry about it. Keep pushing yourself, never stay in your comfort zone, and always set a challenge for yourself in programming and you'll learn over time. Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210789 Share on other sites More sharing options...
phpchick Posted May 5, 2011 Author Share Posted May 5, 2011 I basically am doing multiple if statements as individuals. I'm making great progress but I am at the part of the program where I want to make the user add at least one capital letter but it doesn't seem to recognize capital letters as capital letters. I'm typing in GoLamb21 but it keeps telling me that "Your password must contain at least one capital letter" It doesn't seem to be recognizing the G? if( !ctype_lower($_POST['msg']) ) // the above statement says if pass is all lowercase { $query = "INSERT INTO contact(name,email,msg) VALUES ('$v_name','$v_email','$v_msg')"; $result = mysql_query( $query ); if( !$result ) { die( mysql_error() ); } echo <<<EOD <head> <link rel="stylesheet" type="text/css" href="http://hedgezoo.com/signup.css"> </head> <h2>Free Registration</h2> <form action="contact_insert2.php" method="POST" id="insert"> <table> <tr> <td>Email</td> <td ><input type="text" size="40" name="name"></td> </tr> <tr> <td>Password</td> <td><input type="password" size="40" name="msg" ></td> </tr> <tr> <td colspan=2 id="sub"> <div style="color:red;">Your password must have at least one capital letter.</div> <br /> <input type="submit" name="submit" value="submit"> </td> </tr> </Table> </form> EOD; } if( !ctype_alpha($_POST['msg']) ) // the above statement says if pass contains no special characters { $query = "INSERT INTO contact(name,email,msg) VALUES ('$v_name','$v_email','$v_msg')"; $result = mysql_query( $query ); if( !$result ) { die( mysql_error() ); } echo <<<EOD <head> <link rel="stylesheet" type="text/css" href="http://hedgezoo.com/signup.css"> </head> <h2>Free Registration</h2> <form action="contact_insert2.php" method="POST" id="insert"> <table> <tr> <td>Email</td> <td ><input type="text" size="40" name="name"></td> </tr> <tr> <td>Password</td> <td><input type="password" size="40" name="msg" ></td> </tr> <tr> <td colspan=2 id="sub"> <div style="color:red;">Your password must have at least one special character.</div> <br /> <input type="submit" name="submit" value="submit"> </td> </tr> </Table> </form> EOD; } Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210798 Share on other sites More sharing options...
spiderwell Posted May 5, 2011 Share Posted May 5, 2011 PHPsensei the OP just sucks at PHP We all began somewhere, no one is born with ultimate knowledge of PHP. I was born with it, buy my ma dropped me on my head :'( and that was that, no more php, so here I am in a help forum.... Quote Link to comment https://forums.phpfreaks.com/topic/235570-super-simple-if-v_name-v_msg-into-a-switch/#findComment-1210821 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.