Solved

Problems with nusoap

Posted on 2013-06-21
16
482 Views
Last Modified: 2013-07-02
Hi.

I'm creating a web-service from php by using nusoap libraries. I'm testing this ws from soapUI.

This is the source code I'm using for the web-service:

<?php
require_once "nusoap/lib/nusoap.php";

function dades_sanitari($idProfesional, $idCentro){
	// Connexió a la BD
	$cn = mssql_connect('146.219.196.85:1433','sa','rating');
	mssql_select_db('novahis_real',$cn);

	$strSQL = "SELECT numColegiat, tipus, cognom1, cognom2, nom, dni, telefon, CONVERT(varchar,especialitat), up, sexe, convert(varchar,dataNaix,103) FROM pius_sire_prof WHERE codigo_personal = " . $idProfesional;
//echo $strSQL;
	$query = mssql_query($strSQL, $cn);
	$numColegiat = mssql_result($query,0,0);
	$tipus = mssql_result($query,0,1);
	$cognom1 = mssql_result($query,0,2);
	$cognom2 = mssql_result($query,0,3);
	$nom = mssql_result($query,0,4);
	$dni = mssql_result($query,0,5);
	$telf = mssql_result($query,0,6);
	$especialitat = mssql_result($query,0,7);
	$cup = mssql_result($query,0,8);
	$sexe = mssql_result($query,0,9);
	$dataNaix = mssql_result($query,0,10);
	$retorn = array(	'nom' => $nom,
				'cognom1' => $cognom1,
				'cognom2' => $cognom2,
				'datanaixement' => (string)$dataNaix,
				'cup' => (string)$cup,
				'dni' => $dni,
				'especialitat' => $especialitat,
				'idprofesional' => (string)$idprofesional,
				'numcolegiat' => (string)$numColegiat,
				'sexe' => $sexe,
				'telefon' => $telefon,
				'tipus' => $tipus);
	return $retorn;
}

$server = new soap_server();

$server->configureWSDL("ws_profesional","ws_profesional");

//Create a complex type
$server->wsdl->addComplexType('struc_personal','complexType','struct','all','',
array( 'nom' => array('name' => 'nom','type' => 'xsd:string'),
'cognom1' => array('name' => 'cognom1','type' => 'xsd:string'),
'cognom2' => array('name' => 'cognom2','type' => 'xsd:string'),
'datanaixement' => array('name' => 'datanaixement','type' => 'xsd:string'),
'cup' => array('name' => 'cup','type' => 'xsd:string'),
'dni' => array('name' => 'dni','type' => 'xsd:string'),
'especialitat' => array('name' => 'especialitat','type' => 'xsd:string'),
'idprofesional' => array('name' => 'idprofesional','type' => 'xsd:string'),
'numcolegiat' => array('name' => 'numcolegiat','type' => 'xsd:string'),
'sexe' => array('name' => 'sexe','type' => 'xsd:string'),
'telefon' => array('name' => 'telefon','type' => 'xsd:string'),
'tipus' => array('name' => 'tipus','type' => 'xsd:string'))); 

$server->register("dades_sanitari",array("idProfesional"=>"xsd:string", "idCentro"=>"xsd:string"),
array("returns"=>"tns:struc_personal"),
"ws_profesional",
"ws_profesional#dades_sanitari",
"document",
"literal",
"WS utilitzat pel mò de receptes electròues de STACKS per obtenir les dades del professional");

// Get our posted data if the service is being consumed
// otherwise leave this data blank.
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; 
// pass our posted data (or nothing) to the soap service
$server->service($POST_DATA);

//$server->service($HTTP_RAW_POST_DATA);
?>

Open in new window


This is the call from soapUI:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ws_profesional">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:dades_sanitari>
         <!--You may enter the following 2 items in any order-->
         <idprofessional>802</idprofessional>
         <idCentro>1</idCentro>
      </urn:dades_sanitari>
   </soapenv:Body>
</soapenv:Envelope>

Open in new window


and this is the response:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <dades_sanitariResponse xmlns="ws_profesional"/>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Open in new window


So as you can see I'm getting empty result. Why?



Thank you.
0
Comment
Question by:gplana
  • 9
  • 5
  • 2
16 Comments
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 39267107
If I can gently nudge you in the direction of creating a RESTful web service instead of a SOAP service, I think you will find the entire process easier.  SOAP is unnecessarily complicated and that is why almost all of the big web service providers (Yahoo, Google, etc.) have abandoned it in favor of a RESTful interface.  As but one example, you can test a REST web service by typing a URL into the browser -- easy!

Your RESTful web service can return XML or JSON strings.

As to why the results are empty here, I have no real idea, but here is what I would do.  First see if there is any results set from the MSSQL queries.  Then I would begin adding var_dump() statements into the code as I assembled the variables, printing out each one.

If you're sure the query works and you would like to see an example of a RESTful web service, just let me know.
0
 
LVL 16

Expert Comment

by:Rose Babu
ID: 39270580
Hi,

try to update your code with the below points and test once.

inside the dades_sanitari function

$retorn = array(      'nom' => $nom,
      'cognom1' => $cognom1,
      'cognom2' => $cognom2,
      'datanaixement' => (string)$dataNaix,
      'cup' => (string)$cup,
      'dni' => $dni,
      'especialitat' => $especialitat,
      'idprofesional' => (string)$idprofesional,
      'numcolegiat' => (string)$numColegiat,
      'sexe' => $sexe,
      'telefon' => $telefon,
      'tipus' => $tipus);
return $retorn;

in above code change $idprofesional to $idProfesional and $telefon to $telf

$server->register("dades_sanitari",array("idProfesional"=>"xsd:string", "idCentro"=>"xsd:string"),
array("returns"=>"tns:struc_personal"),
"ws_profesional",
"ws_profesional#dades_sanitari",
"document",
"literal",
"WS utilitzat pel mò de receptes electròues de STACKS per obtenir les dades del professional");

in above code change array("returns"=>"tns:struc_personal") to array("return"=>"tns:struc_personal") //it should return not returns

update your code then test it once. if it is not returning the response then let me know . i have another working solution for your issue too.
0
 
LVL 15

Author Comment

by:gplana
ID: 39270763
Thanks for your help. Still empty results. I have checked the query and the query works ok, but it seems to have some problem with the connection because mssql_num_rows is returning null.
0
 
LVL 15

Author Comment

by:gplana
ID: 39270771
Sorry for my last comment. I was wrong. Connection is working fine and mssql_num_rows is returning 1, so query is working fine. What else could be the problem?

This is my current source code:

<?php
require_once "nusoap/lib/nusoap.php";

function dades_sanitari($idProfesional, $idCentro){
	// Connexió a la BD
	$cn = mssql_connect('146.219.196.85:1433','sa','rating');
	mssql_select_db('novahis_real',$cn);

	$strSQL = "SELECT numColegiat, tipus, cognom1, cognom2, nom, dni, telefon, CONVERT(varchar,especialitat), up, sexe, convert(varchar,dataNaix,103) FROM pius_sire_prof WHERE codigo_personal = " . $idProfesional;
//echo $strSQL;

	$query = mssql_query($strSQL, $cn);
$n = mssql_num_rows($query);
echo "núm: $n\n";
	$numColegiat = mssql_result($query,0,0);
	$tipus = mssql_result($query,0,1);
	$cognom1 = mssql_result($query,0,2);
	$cognom2 = mssql_result($query,0,3);
	$nom = mssql_result($query,0,4);
	$dni = mssql_result($query,0,5);
	$telf = mssql_result($query,0,6);
	$especialitat = mssql_result($query,0,7);
	$cup = mssql_result($query,0,8);
	$sexe = mssql_result($query,0,9);
	$dataNaix = mssql_result($query,0,10);
	$retorn = array(	'nom' => $nom,
				'cognom1' => $cognom1,
				'cognom2' => $cognom2,
				'datanaixement' => (string)$dataNaix,
				'cup' => (string)$cup,
				'dni' => $dni,
				'especialitat' => $especialitat,
				'idprofesional' => (string)$idProfesional,
				'numcolegiat' => (string)$numColegiat,
				'sexe' => $sexe,
				'telefon' => $telf,
				'tipus' => $tipus);
	return $retorn;
}

$server = new soap_server();

$server->configureWSDL("ws_profesional","ws_profesional");

//Create a complex type
$server->wsdl->addComplexType('struc_personal','complexType','struct','all','',
array( 'nom' => array('name' => 'nom','type' => 'xsd:string'),
'cognom1' => array('name' => 'cognom1','type' => 'xsd:string'),
'cognom2' => array('name' => 'cognom2','type' => 'xsd:string'),
'datanaixement' => array('name' => 'datanaixement','type' => 'xsd:string'),
'cup' => array('name' => 'cup','type' => 'xsd:string'),
'dni' => array('name' => 'dni','type' => 'xsd:string'),
'especialitat' => array('name' => 'especialitat','type' => 'xsd:string'),
'idprofesional' => array('name' => 'idprofesional','type' => 'xsd:string'),
'numcolegiat' => array('name' => 'numcolegiat','type' => 'xsd:string'),
'sexe' => array('name' => 'sexe','type' => 'xsd:string'),
'telefon' => array('name' => 'telefon','type' => 'xsd:string'),
'tipus' => array('name' => 'tipus','type' => 'xsd:string'))); 

$server->register("dades_sanitari",array("idProfesional"=>"xsd:string", "idCentro"=>"xsd:string"),
array("return"=>"tns:struc_personal"),
"ws_profesional",
"ws_profesional#dades_sanitari",
"document",
"literal",
"WS utilitzat pel mò de receptes electròues de STACKS per obtenir les dades del professional");

// Get our posted data if the service is being consumed
// otherwise leave this data blank.
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; 
// pass our posted data (or nothing) to the soap service
$server->service($POST_DATA);

//$server->service($HTTP_RAW_POST_DATA);
?>

Open in new window


And this is the call from SoapUI:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ws_profesional">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:dades_sanitari>
         <!--You may enter the following 2 items in any order-->
         <idprofessional>802</idprofessional>
         <idCentro>1</idCentro>
      </urn:dades_sanitari>
   </soapenv:Body>
</soapenv:Envelope>

Open in new window


and this is the response:

núm: 1
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><dades_sanitariResponse xmlns="ws_profesional"></dades_sanitariResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Open in new window

0
 
LVL 15

Author Comment

by:gplana
ID: 39270790
Also I added a print_r of the array just before the return:

	$a = array(	'nom' => $nom,
				'cognom1' => $cognom1,
				'cognom2' => $cognom2,
				'datanaixement' => (string)$dataNaix,
				'cup' => (string)$cup,
				'dni' => $dni,
				'especialitat' => $especialitat,
				'idprofesional' => (string)$idProfesional,
				'numcolegiat' => (string)$numColegiat,
				'sexe' => $sexe,
				'telefon' => $telf,
				'tipus' => $tipus);
print_r($a);
	$retorn = $a;

Open in new window


and the array is filled (all fields except $telf, which has a null value on the database).
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 39271164
Well, it sounds like the data base side of things is working correctly and the problem is with SOAP (as usual).  That's why nobody wants to use SOAP any more - it's a failed technology.

Are you sure you want to go down this dark road?  If you want some help with a REST interface, I will be glad to suggest some easy-to-use concepts.
0
 
LVL 15

Author Comment

by:gplana
ID: 39271174
Not sure. I don't know rest. Are rest web-services too? Can this web-service be converted to rest easyly?
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 39271242
Yes, REST is a design pattern that is suitable for web services.  In fact, the entire WWW is built on REST .  Each request is atomic, complete and stateless.  Each response is complete and usually instantaneous.  Type the URL of a web page and you get a web page -- easy!  The URL arguments are available to the script in the $_GET array, and the script can modify its output based on these arguments.

Here is a "hello world" teaching example of a RESTful web service.

<?php // RAY_REST_get_last_name.php
error_reporting(E_ALL);


// DEMONSTRATE HOW A RESTFUL WEB SERVICE WORKS
// INPUT FIRST NAME, OUTPUT FAMILY NAME
// CALLING EXAMPLE:
// file_get_contents('http://laprbass.com/RAY_REST_get_last_name.php?key=ABC&resp=XML&name=Ray');


// OUR DATA MODEL CONTAINS ALL THE ANSWERS - THIS COULD BE A DATA BASE - AS SIMPLE OR COMPLEX AS NEEDED
$dataModel
= array
( 'Brian'   => 'Portlock'
, 'Ray'     => 'Paseur'
, 'COBOL'   => 'Dinosaur'
, 'Dave'    => 'Baldwin'
)
;


// RESPONSE CAN BE PLAIN TEXT OR XML FORMAT
$alpha = NULL;
$omega = NULL;

// NORMALIZE AND TEST THE "resp=" ARGUMENT
if ( (isset($_GET["resp"])) && (strtoupper(trim($_GET["resp"])) == 'XML') )
{
    // PREPARE THE XML WRAPPER
    $alpha = '<?xml version="1.0" encoding="utf-8" ?>' . PHP_EOL . '<response>' . PHP_EOL;
    $omega = PHP_EOL . '</response>';
}

// TEST THE 'API KEY' - THIS COULD BE A DATA BASE VALIDATION LOOKUP - AS SIMPLE OR COMPLEX AS NEEDED
$key = (!empty($_GET["key"])) ? $_GET["key"] : FALSE;
if ($key !== 'ABC')
{
    die( $alpha . 'BOGUS API KEY' . $omega );
}

// LOOKUP THE FAMILY NAME
$name = (!empty($_GET["name"])) ? $_GET["name"] : 'UNKNOWN';

// IF THE NAME FROM THE URL IS FOUND IN THE DATA MODEL
if (array_key_exists($name, $dataModel))
{
    // RETURNS THE APPROPRIATE FAMILY NAME FROM THE DATA MODEL
    die( $alpha . $dataModel[$name] . $omega );
}

// RETURNS THE UNKNOWN NAME INDICATOR
else
{
    die( $alpha . "UNKNOWN: $name" . $omega );
}

Open in new window

HTH, ~Ray
0
What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 15

Author Comment

by:gplana
ID: 39271267
Also, will it be possible to use SoapUI to test a web-service created by rest?
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 39271302
0
 
LVL 15

Author Comment

by:gplana
ID: 39271360
Mmm, I think we need SoapUI. It's the tool that our provider uses to test our web-service, so I'm sorry but I think we can use REST and we should use SOAP. Any idea to solve the issue?
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 39271431
Any idea to solve the issue?
No idea, none whatsoever.  If you're the one writing the web service, you're the one who gets to tell the clients how to access the web service.  If you write a RESTful web service, it may be possible to access it via SoapUI, but it's certainly not necessary to go to that amount of trouble.

A RESTful web service is like running the 100-meter dash.  A SOAP web service is like running the 100-meter dash blindfolded while people are hitting you with sticks.  That's why experienced developers do not use SOAP any more - we have something better in the form of REST!
0
 
LVL 15

Author Comment

by:gplana
ID: 39271632
Yes, but I ned a SOAP web-service. I wonder if someone can help me find what's wrong on my code.
You said
update your code then test it once. if it is not returning the response then let me know . i have another working solution for your issue too
Can I know what is the other working solution?
0
 
LVL 16

Accepted Solution

by:
Rose Babu earned 500 total points
ID: 39271652
Hi, can you try this updated webservice code which is RPC encoded type?

<?php
require_once "nusoap/lib/nusoap.php";

function dades_sanitari($idProfesional, $idCentro) {
	// Connexió a la BD
	$cn = mssql_connect ( '146.219.196.85:1433', 'sa', 'rating' );
	mssql_select_db ( 'novahis_real', $cn );

	$strSQL = "SELECT numColegiat, tipus, cognom1, cognom2, nom, dni, telefon, especialitat, up, sexe, dataNaix FROM pius_sire_prof WHERE codigo_personal = " . $idProfesional;
	//echo $strSQL;
	$query_result = mssql_query ( $strSQL, $cn );
	
	while ( $rowData = mssql_fetch_array ( $query_result ) ) {
		//$rowData ['CommentBy']

		//numColegiat, tipus, cognom1, cognom2, nom, dni, telefon, especialitat, up, sexe, dataNaix
		$numColegiat = $rowData ['numColegiat'];
		$tipus = $rowData ['tipus'];
		$cognom1 = $rowData ['cognom1'];
		$cognom2 = $rowData ['cognom2'];
		$nom = $rowData ['nom'];
		$dni = $rowData ['dni'];
		$telf = $rowData ['telefon'];
		$especialitat = $rowData ['especialitat'];
		$cup = $rowData ['up'];
		$sexe = $rowData ['sexe'];
		$dataNaix = $rowData ['dataNaix'];
	}
	
	return array ('nom' => $nom, 
				  'cognom1' => $cognom1,
				  'cognom2' => $cognom2,
				  'datanaixement' => ( string ) $dataNaix,
				  'cup' => (string) $cup,
				  'dni' => $dni,
				  'especialitat' => $especialitat,
				  'idprofesional' => (string) $idProfesional, // wrong
				  'numcolegiat' => (string) $numColegiat,
				  'sexe' => $sexe,
				  'telefon' => $telf, // wrong or missing
				  'tipus' => $tipus);
	//return $return;
}

$server = new soap_server ();

$server->configureWSDL ( "ws_profesional", "ws_profesional" );

$namespace = "www.testservice123.net";

$server->register ( "dades_sanitari", 
				array ('idProfesional' => 'xsd:string', 'idCentro' => 'xsd:string' ), 
				array ('return' => 'tns:struc_personal' ), 
				'ws_profesional', 
				'ws_profesional#dades_sanitari', 
				'rpc', 
				'encoded', 
				'WS Description' );

//Create a complex type
$server->wsdl->addComplexType ( 'struc_personal', 'complexType', 'struct', 'all', '', 
					array ('nom' => array ('name' => 'nom', 'type' => 'xsd:string' ), 
						   'cognom1' => array ('name' => 'cognom1', 'type' => 'xsd:string' ), 
						   'cognom2' => array ('name' => 'cognom2', 'type' => 'xsd:string' ), 
						   'datanaixement' => array ('name' => 'datanaixement', 'type' => 'xsd:string' ), 
						   'cup' => array ('name' => 'cup', 'type' => 'xsd:string' ), 
						   'dni' => array ('name' => 'dni', 'type' => 'xsd:string' ), 
						   'especialitat' => array ('name' => 'especialitat', 'type' => 'xsd:string' ), 
						   'idprofesional' => array ('name' => 'idprofesional', 'type' => 'xsd:string' ), 
						   'numcolegiat' => array ('name' => 'numcolegiat', 'type' => 'xsd:string' ), 
						   'sexe' => array ('name' => 'sexe', 'type' => 'xsd:string' ), 
						   'telefon' => array ('name' => 'telefon', 'type' => 'xsd:string' ), 
						   'tipus' => array ('name' => 'tipus', 'type' => 'xsd:string' ) ) );


// Get our posted data if the service is being consumed
// otherwise leave this data blank.
$POST_DATA = isset ( $GLOBALS ['HTTP_RAW_POST_DATA'] ) ? $GLOBALS ['HTTP_RAW_POST_DATA'] : '';
// pass our posted data (or nothing) to the soap service
$server->service ( $POST_DATA );

?>

Open in new window

This works well and returning the response as below.

//Request

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="ws_profesional">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:dades_sanitari soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <idProfesional xsi:type="xsd:string">1</idProfesional>
         <idCentro xsi:type="xsd:string">1</idCentro>
      </ws:dades_sanitari>
   </soapenv:Body>
</soapenv:Envelope>

Open in new window

//Response

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="ws_profesional">
   <SOAP-ENV:Body>
      <ns1:dades_sanitariResponse xmlns:ns1="ws_profesional">
         <return xsi:type="tns:struc_personal">
            <nom xsi:type="xsd:string">nom1</nom>
            <cognom1 xsi:type="xsd:string">cognom1_1</cognom1>
            <cognom2 xsi:type="xsd:string">cognom2_1</cognom2>
            <datanaixement xsi:type="xsd:string">dataNaix1</datanaixement>
            <cup xsi:type="xsd:string">up1</cup>
            <dni xsi:type="xsd:string">dni1</dni>
            <especialitat xsi:type="xsd:string">especialitat1</especialitat>
            <idprofesional xsi:type="xsd:string">1</idprofesional>
            <numcolegiat xsi:type="xsd:string">numColegiat1</numcolegiat>
            <sexe xsi:type="xsd:string">sexe1</sexe>
            <telefon xsi:type="xsd:string">telefon1</telefon>
            <tipus xsi:type="xsd:string">tipus1</tipus>
         </return>
      </ns1:dades_sanitariResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Open in new window

Is there any particular reason you created the webservice as document literal type? if you are ok to use RPC encoded method then you can use it.
0
 
LVL 15

Author Closing Comment

by:gplana
ID: 39271803
Excellent. This was the point. I changed document/literal by rpc/encoded and now it works perfectly.

I used literal/document because I believe it's a more modern way and standard. Just curious: can be possible using it with nusoap?
0
 
LVL 15

Author Comment

by:gplana
ID: 39293655
Hi.
Can you help me on this question?:
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/Q_28168096.html#a39293647

I really need usint NuSOAP this with document/literal.

Thank you.
0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

I imagine that there are some, like me, who require a way of getting currency exchange rates for implementation in web project from time to time, so I thought I would share a solution that I have developed for this purpose. It turns out that Yaho…
This article discusses how to create an extensible mechanism for linked drop downs.
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

747 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

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now