Solved

.net implementing simple javascript luhn check

Posted on 2013-06-28
10
445 Views
Last Modified: 2013-06-28
I have inherited a fairly basic .net site which allows users to register, part of the sign up procedure requires that they enter a valid 19 digit number, the last number of which needs to be checked by a basic luhn checker. Basicaly I want to hook up the code at this url
http://imei.sms.eu.sk/
In to the PRN field on this page, if it was a standard html form I could hook it in easy enough but I am not familiar with .net and thisis using a "wizard" type registration process so do not understand when it is passing post or validation information.

I have included the full .aspx page below.
<%@ Page Language="VB" AutoEventWireup="false" EnableViewStateMac="false" CodeFile="customerDetails.aspx.vb"
  Inherits="customerDetails" MasterPageFile="~/Site.Master" %>

<asp:Content ID="Content3" ContentPlaceHolderID="HeadContent" runat="server">
  <script type="text/javascript" src="/Scripts/countrycodes.js"></script>
  <script type="text/javascript" src="/Scripts/customerDetails.js"></script>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function () {
      $('input[type=text]').bind('copy paste', function (e) {
        e.preventDefault();
      });
    });
  </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server">
  Your Details
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="SubHeading" runat="server">
</asp:Content>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  <div class="sign_up_lft">

  <asp:Panel ID="pnlError" runat="server" Visible="False" CssClass="alert-error">

    <div class="alert-error">
      <asp:Label Font-Bold="false" ID='lblError' runat="server"></asp:Label>
    </div>
    
  </asp:Panel>
  <asp:Wizard ID="Wizard1" runat="server" DisplaySideBar="False" Width="700px" OnNextButtonClick="OnNextButtonClick" FinishStepButtonText="Next" FinishCompleteButtonText="Next" StepPreviousButtonText="Back" CellPadding="10" CssClass="tablewidth">
    <CancelButtonStyle CssClass="btn btn-primary" />
    <NavigationButtonStyle CssClass="btn btn-primary" />
    <StepNextButtonStyle CssClass="btn btn-primary" />
    <StepPreviousButtonStyle CssClass="btn btn-primary" />
    
    <WizardSteps>
      <asp:WizardStep ID="WizardStep1" runat="server" Title="">
       <div class="req"><span class="red">*</span> fields are mandatory. </div>
	   
	   <%-- <h2>
          Your Name</h2>--%>
           <%--<label for="txtBillingFirstnames">
            First Name: <span class="red">*</span> <span style="font-size: smaller">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* a mandatory field</span></label>--%>
          <span class="profile_01"><h2><b>1.</b> Your Name </h2></span>
            <div class="quote_form">
          <label for="txtBillingFirstnames" class="lft_name">
            First Name:<span class="red"> *</span> </label>
          <asp:TextBox ID="txtBillingFirstnames" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"> </asp:TextBox>
          <asp:RequiredFieldValidator ID="valBillingFirstnames"
                                      runat="server" ErrorMessage="Please enter first name" 
                                      ControlToValidate="txtBillingFirstnames" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>

          <label for="txtBillingSurname" class="lft_name">
            Last Name:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingSurname" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"> </asp:TextBox>
          <asp:RequiredFieldValidator ID="valBillingSurname"
                                      runat="server" ErrorMessage="Please enter surname" 
                                      ControlToValidate="txtBillingSurname" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>

        </div>
        
		<asp:RequiredFieldValidator ID="valBillingAddress1"
                                      runat="server" ErrorMessage="Please enter address line 1" 
                                      ControlToValidate="txtBillingAddress1" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
		
		<%--<h3>
          Your Address<a rel="tooltip" href="#" title="This is the address that your new allpay Mobile SIM card will be dispatched to.">?</a></h3>--%>
          <span class="profile_01 profile_tx"><h2><b>2.</b> Your Address </h2><a rel="tooltip" href="#" title="This is the address that your new allpay Mobile SIM card will be dispatched to.">?</a></span>
          <div class="quote_form">
          <label for="txtBillingAddress1" class="lft_name">
            Address Line 1:<span class="red"> *</span></label>
          &nbsp;<asp:TextBox ID="txtBillingAddress1" MaxLength="100" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          
             
          <label for="txtBillingAddress2" class="lft_name">
            Address Line 2:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingAddress2" MaxLength="100" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
         
             
          <label for="txtBillingCity" class="lft_name">
            City / Town:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingCity" MaxLength="40" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingCity"
                                      runat="server" ErrorMessage="Please enter city" 
                                      ControlToValidate="txtBillingCity" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
          
          <label for="txtBillingPostCode" class="lft_name">
            Postcode:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingPostCode" MaxLength="10" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingPostCode"
                                      runat="server" ErrorMessage="Please enter postcode" 
                                      ControlToValidate="txtBillingPostCode" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
          
          <label for="txtBillingCountry" class="lft_name">
            Country:<span class="red"> *</span></label>
          <asp:TextBox ID="txtBillingCountry" MaxLength="10" runat="server" Text="GB" ClientIDMode="Static"
                       ReadOnly="True" class="txt_box"/>
          <br /><asp:RequiredFieldValidator ID="valBillingCountry"
                                      runat="server" ErrorMessage="Please enter country" 
                                      ControlToValidate="txtBillingCountry" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/> 
        </div>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep2" runat="server" Title="">
      <%--  <h3>
          Your Contact Details</h3>--%>
          <span class="profile_01 profile_tx"><h2>Your Contact Details</h2></span>

        <div class="quote_form">
          <label for="txtBillingPhone" class="lft_name">
            Your Telephone Number:<a rel="tooltip" href="#" title="Please enter your telephone number">?</a></label>
          <asp:TextBox ID="txtBillingPhone" MaxLength="20" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 

          <label for="txtCustomerEMail" class="lft_name">
           Your Email Address:<span class="red"> *</span></label>
          <asp:TextBox ID="txtCustomerEMail" MaxLength="255" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 
          <br /><asp:RequiredFieldValidator ID="valCustomerEmail"
                                      runat="server" ErrorMessage="Please enter email" 
                                      ControlToValidate="txtCustomerEMail" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
                                      
          <asp:RegularExpressionValidator ID="valEmailFormat1" runat="server" ErrorMessage="Please enter a valid email address" ClientIDMode="Static" ControlToValidate="txtCustomerEMail" Display="Dynamic" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
          
          <label for="txtCustomerEMail2" class="lft_name">
            Confirm Email Address:<span class="red"> *</span></label>
          <asp:TextBox ID="txtCustomerEMail2" MaxLength="255" runat="server" Text="" ClientIDMode="Static" class="txt_box"/> 
          <br /><asp:RequiredFieldValidator ID="valCustomerEmail2"
                                      runat="server" ErrorMessage="Please re-enter your email" 
                                      ControlToValidate="txtCustomerEMail2" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True"/>
          
           <asp:RegularExpressionValidator ID="valEmailFormat2" runat="server" ErrorMessage="Please enter a valid email address" ClientIDMode="Static" ControlToValidate="txtCustomerEMail2" ForeColor="Red" Display="Dynamic" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
                                       
          <asp:CompareValidator ID="valCompareEmail" 
                                      runat="server" ErrorMessage="Email addresses do not match" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True" ControlToCompare="txtCustomerEMail" ControlToValidate="txtCustomerEMail2"></asp:CompareValidator>


          <asp:Panel runat="server" ID="pnlAdditional" Visible="True">
            <label for="ddlGender" class="lft_name">
              Lead Soucre:</label>
            <asp:DropDownList ID="ddlMarketing" runat="server">
              <asp:ListItem Value="Leaflet" Text="Leaflet" />
              <asp:ListItem Value="Poster in rent payment office" Text="Poster in rent payment office" />
		<asp:ListItem Value="Twitter/ Facebook" Text="Twitter/ Facebook" />
		<asp:ListItem Value="Newsletter/ Magazine" Text="Newsletter/ Magazine" />
		<asp:ListItem Value="Friend/ family recommendation" Text="Friend/ family recommendation" />
		<asp:ListItem Value="Rent Statement" Text="Rent Statement" />
		<asp:ListItem Value="Website" Text="Website" />
		<asp:ListItem Value="Google/ bing/ yahoo" Text="Google/ bing/ yahoo" />
		<asp:ListItem Value="Other" Text="Other" />
            </asp:DropDownList>
            
            <label for="txtPRN" class="lft_name">
              PRN<span class="red"> *</span></label>
            <asp:TextBox ID="txtPRN" MaxLength="19" runat="server" Text="" ClientIDMode="Static" class="txt_box"/>
            
              
          </asp:Panel>
</div>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep3" runat="server" Title="">
        <asp:Panel ID="pnlDeliveryAddress" runat="server">
          <h4>
            Delivery Details</h4>

    <div class="delivery">     
            <!-- delivery same checkbox -->
			<div class="check">
            <asp:CheckBox ID="IsDeliverySame" runat="server" OnCheckedChanged="IsDeliverySame_Clicked" AutoPostBack="True" /></div>
            <label class="checkbox-label" for="IsDeliverySame">
              Is your delivery address the same as your billing address?</label>
  </div>

            <h4>
              Your Name</h4>

            <div>
              <label for="txtDeliveryFirstnames">
                First Name:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryFirstnames" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryFirstnames"
                                          runat="server" ErrorMessage="Please enter first name" 
                                          ControlToValidate="txtDeliveryFirstnames" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliverySurname">
                Last Name:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliverySurname" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliverySurname"
                                          runat="server" ErrorMessage="Please enter surname" 
                                          ControlToValidate="txtDeliveryFirstnames" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
            



            <div class="profile_01"><h4>
              Your Address</h4></div>

              <label for="txtDeliveryAddress1">
                Address line 1:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryAddress1" MaxLength="100" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryAddress1"
                                          runat="server" ErrorMessage="Please enter address line 1" 
                                          ControlToValidate="txtDeliveryAddress1" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryAddress2">
                Address line 2:</label>
              <asp:TextBox ID="txtDeliveryAddress2" MaxLength="100" runat="server" Text="" ClientIDMode="Static"/>

              <label for="txtDeliveryCity">
                City:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryCity" MaxLength="40" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryCity"
                                          runat="server" ErrorMessage="Please enter city" 
                                          ControlToValidate="txtDeliveryCity" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryPostCode">
                Postcode:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryPostCode" MaxLength="10" runat="server" Text="" ClientIDMode="Static"/>
              <asp:RequiredFieldValidator ID="valDeliveryPostcode"
                                          runat="server" ErrorMessage="Please enter poscode" 
                                          ControlToValidate="txtDeliveryPostCode" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
              
              <label for="txtDeliveryCountry">
                Country:<span class="red"> *</span></label>
              <asp:TextBox ID="txtDeliveryCountry" MaxLength="10" runat="server" Text="GB" ClientIDMode="Static" ReadOnly="True"/>
              <asp:RequiredFieldValidator ID="valDeliveryCountry"
                                          runat="server" ErrorMessage="Please enter country" 
                                          ControlToValidate="txtDeliveryCountry" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
                                          
                                          
              <label for="txtDeliveryPhone">
                Phone:</label>
              <asp:TextBox ID="txtDeliveryPhone" MaxLength="20" runat="server" Text="" ClientIDMode="Static"/>
              
            



           

        </asp:Panel>
      </asp:WizardStep>
      <asp:WizardStep ID="WizardStep4" runat="server" Title="">
        <asp:Panel ID="pnlRegOptions1" runat="server">
          <div><h4>
            Security Settings</h4></div>

            <label for="txtPassword">
              Password:<span class="red"> *</span></label>
            <asp:TextBox ID="txtPassword" MaxLength="20" runat="server" Text="" ClientIDMode="Static" />
            <asp:RequiredFieldValidator ID="valPassword"
                                          runat="server" ErrorMessage="Please enter password" 
                                          ControlToValidate="txtPassword" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>

            <label for="txtPassword2">
              Confirm Password:<span class="red"> *</span></label>
            <asp:TextBox ID="txtPassword2" MaxLength="20" runat="server" Text="" ClientIDMode="Static" />
            <asp:RequiredFieldValidator ID="valPassword2"
                                          runat="server" ErrorMessage="Please re-enter password" 
                                          ControlToValidate="txtPassword2" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
                                          
            <asp:CompareValidator ID="valComparePassword" 
                                      runat="server" ErrorMessage="Passwords do not match" Display="Dynamic" ForeColor="Red" 
                                      SetFocusOnError="True" ControlToCompare="txtPassword" ControlToValidate="txtPassword2"></asp:CompareValidator>

            <label for="ContentPlaceHolder1_ddlSecurityQuestion">
              Security Question:<span class="red"> *</span></label>
            <asp:DropDownList ID="ddlSecurityQuestion" runat="server">
              <asp:ListItem>
              </asp:ListItem>
              <asp:ListItem>Favourite Pet</asp:ListItem>
              <asp:ListItem>First School Attended</asp:ListItem>
              <asp:ListItem>Mother's Maiden Name</asp:ListItem>
              <asp:ListItem>Childhood Nickname</asp:ListItem>
            </asp:DropDownList>
            <asp:RequiredFieldValidator ID="valSecurityQuestion"
                                          runat="server" ErrorMessage="Please select a security question" 
                                          ControlToValidate="ddlSecurityQuestion" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>
            <br />
            <label for="txtSecurityAnswer">
              Security Answer:<span class="red"> *</span></label>
            <asp:TextBox ID="txtSecurityAnswer" MaxLength="50" runat="server" Text="" ClientIDMode="Static" TextMode="SingleLine" />
            <asp:RequiredFieldValidator ID="valSecurityAnswer"
                                          runat="server" ErrorMessage="Please enter security answer" 
                                          ControlToValidate="txtSecurityAnswer" Display="Dynamic" ForeColor="Red" 
                                          SetFocusOnError="True"/>

            <br />
        



        </asp:Panel>
      </asp:WizardStep>
      
    </WizardSteps>
  </asp:Wizard>
  </div>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="RightSide">
  <asp:Panel ID="pnlRightSide" runat="server">
  </asp:Panel>
</asp:Content>


<asp:Content runat="server" ContentPlaceHolderID="ProgressBar">
  <asp:Panel ID="pnlProgressBar" runat="server">
    
  <%--<asp:Image id="ProgBar" runat="server" CssClass="float_m progress"></asp:Image>--%>
  
  </asp:Panel>
</asp:Content>

Open in new window

0
Comment
Question by:ScorchD
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 4
10 Comments
 
LVL 57

Expert Comment

by:Julian Hansen
ID: 39284030
So basically lines 9-14 you want to do this
    $(document).ready(function () {
      $('input[type=text]').bind('copy paste', function (e) {
        e.preventDefault();
      });
/* If you want to check the number immediately after the field looses focus */
     $('#txtPRN').blur(function() {
        var val = $(this).val();
        // perform LUHN check here - can put luhn check in a function and call it here
        // or put the code directly
        if (!ValidateLuhn(val)) {
         // errror here
        }
     });
    });

function ValidateLuhn(Luhn)
 {
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	if (Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

Open in new window

You can also pick up the button clicks and check there as well.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284252
Brilliant, I cant quite get it to work though, I also want to prevent the default actiioon for the form if the PRN field isnt valid, its rather crude but I have been trying to do so by preventing the default action of the next button like this.
jQuery(document).ready(function(){
jQuery.fn.exists = function(){return this.length>0;}
if ($("#txtPRN").length > 0) {

$("#ContentPlaceHolder1_Wizard1_StepNavigationTemplateContainerID_StepNextButton").click(function(event) {

event.preventDefault();
$('#ContentPlaceHolder1_Wizard1_pnlAdditional').append('<span id="prn-msg">Please enter a valid PRN</span>')
});

}

Open in new window

That aside for some reason I cannot get the above code that you gave me to work and I cannot work out why. In simplest form why does this not work?
jQuery(document).ready(function () {
     
     $('#txtPRN').blur(function() {
        var val = $(this).val();
		if (ValidateLuhn(val)) {
		alert('Valid');
		}else{
         alert('Invalid');
        }
     });
    });

function ValidateLuhn(Luhn)
 {
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	if (Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

});

Open in new window

0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284329
I have the function working, apologies, it was a typo within the Calculate function.
Still not sure how best to prevent and then allow the user through, there isn't anyway to revert to default action of the onclick handler? I realize that it is not action based.

Many thanks for your time.
0
PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

 
LVL 57

Accepted Solution

by:
Julian Hansen earned 500 total points
ID: 39284385
If you have a form you can catch the submit event
$('#idofform').submit(function() {
   // check here
  //  return false if fails - this will prevent form being submitted
});

Open in new window

If there is only one form then you can select like so
$('form').submit( ....

Open in new window

For the click
$('#idofbutton').click(function(e) {
    if (ValidateLuhn(val)) {
      return true;
    }
    e.preventDefault(); 
    return false;
   return rv;
});

Open in new window

0
 
LVL 4

Author Closing Comment

by:ScorchD
ID: 39284437
Excellent, thank you.

If I could award more points for this I would :)
0
 
LVL 57

Expert Comment

by:Julian Hansen
ID: 39284448
You are most welcome - thanks for the points and good luck with your project.

Just saw a typo in the last bit of script

the return rv - shoud be removed.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284453
Yes I noticed that, thank you
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284601
Julian if you are still there could I ask a really quick one, I also need to do a quick check to make sure the luhn value is 19 long, however this doesnt seem to be working?
function ValidateLuhn(Luhn)
 {
 
	var LuhnDigit = parseInt(Luhn.substring(Luhn.length-1,Luhn.length));
	var LuhnLess = Luhn.substring(0,Luhn.length-1);
	var LuhnLength = Luhn.length;
	if ( LuhnLength = 19 && Calculate(LuhnLess)==parseInt(LuhnDigit))
	{
		return true;
	}	
	return false;
 }

Open in new window

0
 
LVL 57

Expert Comment

by:Julian Hansen
ID: 39284686
Common mistake

if ( LuhnLength = 19 && Calculate(LuhnLess)==parseInt(LuhnDigit))

You are using the assignment '=' instead of equality check '==' here so you are setting the length to 19 irrespective of the length.
0
 
LVL 4

Author Comment

by:ScorchD
ID: 39284717
Ah of course, thank you!
You are right at the top of my Christmas list.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Javascript reference in ExcelWebAddIn Project 2 33
Edit my bash script 16 46
Dropdown animation to normal dropdown 6 28
Jquery syntax 12 29
This article discusses how to create an extensible mechanism for linked drop downs.
In threads here at EE, each comment has a unique Identifier (ID). It is easy to get the full path for an ID via the right-click context menu. However, we often want to post a short link within a thread rather than the full link. This article shows a…
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

732 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question