troubleshooting Question

Prevent PHP form submit depending on Ajax form response

Avatar of Richard Lloyd
Richard Lloyd asked on
PHPAJAX
5 Comments1 Solution140 ViewsLast Modified:
I have a PHP form that is used for entering a membership number.

When the input field changes, an ajax call is fired to a. check that the card number is from a valid range of possible card numbers and b. check if the card has already been issued.

If both checks are satisfied then no error message are displayed and the user can submit the form.

If either check fails, a warning message is displayed (either card not valid, or card already issued), but the form can still be submitted.

I also use https://jqueryvalidation.org/ to validate the format of the field and other in the form.

I am looking for a way of making the submit button "disabled"  unless the 2 checks on the field are satisfied. This could be either via the https://jqueryvalidation.org/ or otherwise.

The relevant parts of the code are shown below

Thank you.

<form action'#' method='post' id='account-add'>";
Card No<br/>
<input type='text' name='cardno' id='cardno'/><div id='disp'></div>
<input type='hidden' name='postback' value='add'/>
<input type='submit' id='submit' value='Add' />
</form>
	
<!--jquery validation-->
<script src="https://cdn.jsdelivr.net/jquery.validation/1.15.0/jquery.validate.min.js?v=1"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.15.0/additional-methods.min.js?v=1"></script>
<script>
$().ready(function() {
					$.validator.addMethod("cardno", function(value, element) {
							return this.optional(element) || /^xyz[0|1|9]\d{5}X$|^LYBLA[2|3|4|9]\d{6}$|^TMP\d{9}$/i.test(value);
					}, "Card Number is invalid. It should be xyz, 6 digits ending with X, or 7 digits");
$("#account-add").validate({
		rules: {
			cardno: {cardno:true,
							required:true},
		},
		messages: {
			cardno: "Card no must be in the format xyz followed by 6 digits ending in X, or 7 digits.",
		}
	});

});
</script>

<!--Ajax call-->
<script type="text/javascript">
$(document).ready(function(){
$("#cardno").change(function() {
var cardno = $('#cardno').val();
if(cardno==="")
{
$("#disp").html("");
}
else
{
$.ajax({
type: "POST",
url: "match-cardno.php",
data: "cardno="+ cardno + "&companyid=xyz",
success: function(html){
$("#disp").html(html);
}
});
return false;
}
});
});
</script>

match-cardno.php
<?php session_start();

include 'config.php';


if(isset($_POST['cardno'])){
$cardno=$_POST['cardno'];
$companyid=$_POST['companyid'];

//check card exists in list of possible cards
$sql="select cardno from tblcardpossibles where cardno =? and companyid=?";
$params=array($cardno, $companyid);
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$result=sqlsrv_query($conn, $sql, $params, $options);
include "error.php";

$row_count = sqlsrv_num_rows($result);
if($row_count=='0'){
echo "<p class='error'>You have entered an invalid card number. Please check your entry. </p>";}


//Check if card has already been issued
$sql="select title, firstname, surname, postcode from tblcardsissued where cardno =? and companyid=?";
$params=array($cardno, $companyid);
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$result=sqlsrv_query($conn, $sql, $params, $options);
include "error.php";

$row_count = sqlsrv_num_rows($result);
$row= sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC);

if($row_count<>0){
$title=$row['title'];
$firstname=$row['firstname'];
$surname=$row['surname'];
$postcode=$row['postcode'];
echo "<p class='error'>Card already issued to $title $firstname $surname, $postcode</p>";}
}

?>
ASKER CERTIFIED SOLUTION
Join our community to see this answer!
Unlock 1 Answer and 5 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 1 Answer and 5 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros