<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=WebServices%2C_SOAP</id>
	<title>WebServices, SOAP - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=WebServices%2C_SOAP"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=WebServices,_SOAP&amp;action=history"/>
	<updated>2026-08-30T09:27:17Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=WebServices,_SOAP&amp;diff=1871&amp;oldid=prev</id>
		<title>Joan a 20:35, 3 març 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=WebServices,_SOAP&amp;diff=1871&amp;oldid=prev"/>
		<updated>2009-03-03T20:35:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;En el manual del desenvolupador hi ha un apartat que fa una introducció de com podem accedir al Sugar CRM a través dels Web Services.&lt;br /&gt;
&lt;br /&gt;
SugarCRM proporciona una API de Web Services a través de la implementació del protocol SOAP que fa NuSOAP PHP. SOAP significa ''Simple Object Access Protocol''. S'utilitza per fer Crides a Procediments Remots (RPC, ''Remote Procedure Calls'') a través del protocol HTTP mitjançant missatges XML.&lt;br /&gt;
&lt;br /&gt;
La API de SugarSoap està construïda utilitzant la llibreria NuSOAP que s'inclou en les tres versions de Sugar CRM. Es pot veure l'API a:&lt;br /&gt;
 http://localhost/sugarcrm/soap.php&lt;br /&gt;
&lt;br /&gt;
El fitxer SugarSoap WSDL (Web Services Description Language) es troba a:&lt;br /&gt;
 http://localhost/sugarcrm/soap.php?wsdl&lt;br /&gt;
&lt;br /&gt;
Gràcies als diversos toolkits disponibles, és fàcil fer efectiu l'ús  dels SOAP Web Services des d'una varietat de llenguatges de programació, en particular amb Sugar i la seva ampla llista de serveis basats en SOAP que ofereix.&lt;br /&gt;
&lt;br /&gt;
Per als següents exemples s'utilitza PHP juntament amb el toolkit NuSOAP. Evidentment ens podrem connectar al SugarCRM via SOAP i escriure les nostres pròpies aplicacions en Java, C++ o qualsevol altre llenguatge de programació amb capacitat SOAP.&lt;br /&gt;
&lt;br /&gt;
Nota: el primer que hem de fer és assegurar-nos que el fitxer de variables config.php funciona correctament: http://localhost/sugarcrm/config.php&lt;br /&gt;
&lt;br /&gt;
En la carpeta ''examples'' hi ha exemples de connexió:&lt;br /&gt;
&lt;br /&gt;
El primer que passa quan executem SoapTest.php és un error:&lt;br /&gt;
 http://localhost/sugarcrm/examples/SoapTest.php&lt;br /&gt;
 error: Not a valid entry point&lt;br /&gt;
&lt;br /&gt;
Això es soluciona ficant define('sugarEntry', TRUE); a dalt de tot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Your code is fine actually. When you include 'nusoap/nusoap.php' toward the top of your file, it's using the copy of nuSOAP found in Sugar (which has protections built in for entry points). You can either add this line to the top of your PHP file:&lt;br /&gt;
&lt;br /&gt;
PHP Code:&lt;br /&gt;
define('sugarEntry', TRUE);  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i ara ja funciona.&lt;br /&gt;
&lt;br /&gt;
Un exemple mínim per connectar-se als Web Services de Sugar CRM:&lt;br /&gt;
&lt;br /&gt;
fitxer echoprova.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
define('sugarEntry', TRUE);  &lt;br /&gt;
&lt;br /&gt;
require_once('../include/nusoap/nusoap.php');&lt;br /&gt;
&lt;br /&gt;
$client = new nusoapclient('http://localhost/sugarcrm/soap.php');&lt;br /&gt;
&lt;br /&gt;
$auth_array = array(&lt;br /&gt;
'user_auth' =&amp;gt; array(&lt;br /&gt;
'user_name' =&amp;gt; 'admin',&lt;br /&gt;
'password' =&amp;gt; md5('****'),&lt;br /&gt;
)&lt;br /&gt;
);&lt;br /&gt;
 &lt;br /&gt;
$login_results = $client-&amp;gt;call('login',$auth_array);&lt;br /&gt;
$session_id = $login_results['id'];&lt;br /&gt;
$user_guid = $client-&amp;gt;call('get_user_id',$session_id);&lt;br /&gt;
printf(&amp;quot;\n&amp;quot;.$auth_array['user_auth']['user_name'].' has a GUID of ' . $user_guid . &amp;quot;\n\n&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bàsicament ens connectem amb el login i pwd (substituir pel password correcte), fa un call i visualitzem el GUID del login amb què ens hem connectat.&lt;br /&gt;
&lt;br /&gt;
L'exemple SoapTestPortal.php i SoapTestPortal2.php són més complets, però no funcionen perquè es necessita Sugar Portal i la versió Enterprise o Professional de Sugar&lt;br /&gt;
&lt;br /&gt;
==Exemple2. Inserir un lead==&lt;br /&gt;
inserir_lead.php (ha funcionat)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
 define('sugarEntry', TRUE);&lt;br /&gt;
 //Use the NuSOAP files&lt;br /&gt;
 require_once('../include/nusoap/nusoap.php');&lt;br /&gt;
 &lt;br /&gt;
 $soapclient = new nusoapclient('http://localhost/sugarcrm/soap.php?wsdl',true);&lt;br /&gt;
 &lt;br /&gt;
 $user_auth = array(&lt;br /&gt;
                 'user_auth' =&amp;gt; array(&lt;br /&gt;
                       'user_name' =&amp;gt; 'admin',&lt;br /&gt;
                       'password' =&amp;gt; md5('****'),&lt;br /&gt;
                       'version' =&amp;gt; '0.1'&lt;br /&gt;
                       ),&lt;br /&gt;
                 'application_name' =&amp;gt; 'soapleadcapture');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $result_array = $soapclient-&amp;gt;call('login',$user_auth);&lt;br /&gt;
 &lt;br /&gt;
 $session_id =  $result_array['id'];&lt;br /&gt;
&lt;br /&gt;
 $user_guid = $soapclient-&amp;gt;call('get_user_id',$session_id);&lt;br /&gt;
  &lt;br /&gt;
 // Up until now, we have not introduced anything new&lt;br /&gt;
 // The following lines will use the set_entry SOAP call to add&lt;br /&gt;
 // a Lead from a mixture of POST variables and hard coded&lt;br /&gt;
 // values, then assign to the authenticated Sugar user...&lt;br /&gt;
/* $set_entry_params = array(&lt;br /&gt;
                       'session' =&amp;gt; $session_id,&lt;br /&gt;
                       'module_name' =&amp;gt; 'Leads',&lt;br /&gt;
                       'name_value_list'=&amp;gt;array(&lt;br /&gt;
                           array('name'=&amp;gt;'first_name','value'=&amp;gt;$_POST['first_name']),&lt;br /&gt;
                           array('name'=&amp;gt;'last_name','value'=&amp;gt;$_POST['last_name']),&lt;br /&gt;
                           array('name'=&amp;gt;'status', 'value'=&amp;gt;'New'),&lt;br /&gt;
                           array('name'=&amp;gt;'phone_work', 'value'=&amp;gt;$_POST['phone']),&lt;br /&gt;
                           array('name'=&amp;gt;'phone_fax', 'value'=&amp;gt;$_POST['fax']),&lt;br /&gt;
                           array('name'=&amp;gt;'account_name','value'=&amp;gt;$_POST['companyname']),&lt;br /&gt;
                           array('name'=&amp;gt;'lead_source','value'=&amp;gt;'Web Site'),&lt;br /&gt;
                           array('name'=&amp;gt;'description','value'=&amp;gt;$_POST['prod_desc']),&lt;br /&gt;
                           array('name'=&amp;gt;'assigned_user_id', 'value'=&amp;gt;$user_guid)));&lt;br /&gt;
*/&lt;br /&gt;
 $set_entry_params = array(&lt;br /&gt;
                       'session' =&amp;gt; $session_id,&lt;br /&gt;
                       'module_name' =&amp;gt; 'Leads',&lt;br /&gt;
                       'name_value_list'=&amp;gt;array(&lt;br /&gt;
                           array('name'=&amp;gt;'first_name','value'=&amp;gt;'Pere'),&lt;br /&gt;
                           array('name'=&amp;gt;'last_name','value'=&amp;gt;'Pruna'), &lt;br /&gt;
                           array('name'=&amp;gt;'status', 'value'=&amp;gt;'New'),&lt;br /&gt;
                           array('name'=&amp;gt;'phone_work', 'value'=&amp;gt;'659.00.61.56'),&lt;br /&gt;
                           array('name'=&amp;gt;'phone_fax', 'value'=&amp;gt;'93.456.56.56'),&lt;br /&gt;
                           array('name'=&amp;gt;'account_name','value'=&amp;gt;'Balmes SCCP'),&lt;br /&gt;
                           array('name'=&amp;gt;'lead_source','value'=&amp;gt;'www.balmessccp.org'),&lt;br /&gt;
                           array('name'=&amp;gt;'description','value'=&amp;gt;'la descripció del possible client'),&lt;br /&gt;
                           array('name'=&amp;gt;'assigned_user_id', 'value'=&amp;gt;$user_guid)));&lt;br /&gt;
&lt;br /&gt;
 $result = $soapclient-&amp;gt;call('set_entry',$set_entry_params);&lt;br /&gt;
 &lt;br /&gt;
 // this redirects to a page specified in the previous page...&lt;br /&gt;
 //header(&amp;quot;Location:  &amp;quot; . $_POST['redirect']);&lt;br /&gt;
 &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On veig la llista de tots els camps que es poden omplir per a un lead? Doncs a /sugarcrm/modules/leads/metadata/detailedviewdefs.php.&lt;br /&gt;
&lt;br /&gt;
Aquí puc veure que per exemple hi ha un camp que és el ''do_not_call'', i per tant puc afegir la línia&lt;br /&gt;
 array('name'=&amp;gt;'do_not_call','value'=&amp;gt;True),&lt;br /&gt;
&lt;br /&gt;
Recordar que a http://mysugar/soap.php hi ha la documentació bàsica sobre els mètodes exposats de les funcions SOAP.&lt;br /&gt;
&lt;br /&gt;
==Exemple3. Login with error checking==&lt;br /&gt;
És una funció que valida un login i password de SugarCRM. Podria servir per validar l'entrada a una aplicació web amb els logins i passwords de Sugar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? &lt;br /&gt;
function wsLogin($userName, $Password)&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
echo &amp;quot;including&amp;quot;;&lt;br /&gt;
require_once('../include/nusoap/nusoap.php');&lt;br /&gt;
  &lt;br /&gt;
$Connectionstring = 'http://localhost/sugarcrm/soap.php?wsdl';&lt;br /&gt;
$wsdl=&amp;quot;http://localhost/sugarcrm/soap.php?wsdl&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$sugar_client = new soapclient($wsdl, true);&lt;br /&gt;
echo &amp;quot;get the client &amp;quot;;&lt;br /&gt;
$proxy =  $sugar_client-&amp;gt;getProxy();&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;proxy &amp;quot;;&lt;br /&gt;
  $ret =  $proxy-&amp;gt;test('OK');&lt;br /&gt;
echo &amp;quot;test is: $ret&amp;quot;;&lt;br /&gt;
echo &amp;quot;password conded is: &amp;quot;. md5($Password) . &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
$user_auth = array(&lt;br /&gt;
	'user_name' =&amp;gt; $userName,&lt;br /&gt;
     	'password' =&amp;gt; md5($Password),&lt;br /&gt;
	'version' =&amp;gt; &amp;quot;1&amp;quot;,    		&lt;br /&gt;
);&lt;br /&gt;
			  			&lt;br /&gt;
$login_results=  $proxy-&amp;gt;login($user_auth, &amp;quot;pipo&amp;quot;);&lt;br /&gt;
	 				 &lt;br /&gt;
if($login_results['error']['name']==&amp;quot;No Error&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
	return   $session_id =  $login_results['id'];&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
	return $login_results['error']['name'];&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Llistar casos==&lt;br /&gt;
Després de barallar-me bastant, he aconseguit llistar els casos que hi ha ficats al SugarCRM, amb la possibilitat de filtrar i d'ordenar. El mètode ''response'' és important per depurar doncs dóna molta informació d'on estan els errors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
define('sugarEntry', TRUE);  &lt;br /&gt;
&lt;br /&gt;
require_once('../include/nusoap/nusoap.php');&lt;br /&gt;
&lt;br /&gt;
$client = new nusoapclient('http://localhost/sugarcrm/soap.php?wsdl',true);&lt;br /&gt;
&lt;br /&gt;
$pass = md5('****');&lt;br /&gt;
echo &amp;quot;Login Result: &amp;quot;;&lt;br /&gt;
echo $client-&amp;gt;call('create_session', array('user_name'=&amp;gt;'admin', 'password'=&amp;gt;$pass));&lt;br /&gt;
echo &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$auth_array = array(&lt;br /&gt;
'user_auth' =&amp;gt; array(&lt;br /&gt;
'user_name' =&amp;gt; 'admin',&lt;br /&gt;
'password' =&amp;gt; md5('****'),&lt;br /&gt;
)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$login_results = $client-&amp;gt;call('login',$auth_array);&lt;br /&gt;
$session_id = $login_results['id'];&lt;br /&gt;
printf(&amp;quot;Session ID: &amp;quot;. $session_id . &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$module_name='Cases';&lt;br /&gt;
$query='cases.name like &amp;quot;%warning%&amp;quot;';&lt;br /&gt;
$order_by='cases.id';&lt;br /&gt;
$offset=0;&lt;br /&gt;
$select_fields=array(&lt;br /&gt;
'id',&lt;br /&gt;
'case_number',&lt;br /&gt;
'name',&lt;br /&gt;
'status',&lt;br /&gt;
);&lt;br /&gt;
$max_results=5;&lt;br /&gt;
$deleted=0;&lt;br /&gt;
&lt;br /&gt;
$search_list=$client-&amp;gt;call('get_entry_list',array($session_id,$module_name,$query,$order_by,$offset,$select_fields,$max_results,$deleted));&lt;br /&gt;
echo &amp;quot;numero de resultats &amp;quot;.$search_list['result_count'].&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
echo &amp;quot;el mètode response va molt bé per editar errors. Per exemple, si faig referència a un camp que no existeix en el order by&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
echo $client-&amp;gt;response;&lt;br /&gt;
echo &amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function nameValuePairToSimpleArray($array){&lt;br /&gt;
$my_array=array();&lt;br /&gt;
while(list($name,$value)=each($array)){&lt;br /&gt;
$my_array[$value['name']]=$value['value'];&lt;br /&gt;
}&lt;br /&gt;
return $my_array;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Search result is &amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
if($search_list['result_count']&amp;gt;0){&lt;br /&gt;
foreach($search_list['entry_list'] as $record){&lt;br /&gt;
$array= nameValuePairToSimpleArray($record['name_value_list']);&lt;br /&gt;
echo $array['id'] . &amp;quot; :: &amp;quot; . $array['case_number'] . &amp;quot; - &amp;quot; . $array['name'] . &amp;quot; - &amp;quot; . $array['status'] . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
else { echo &amp;quot;No cases found&amp;quot;;&lt;br /&gt;
echo &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// End the session&lt;br /&gt;
echo &amp;quot;Closing Session: &amp;quot;;&lt;br /&gt;
echo $client-&amp;gt;call('end_session', array('user_name'=&amp;gt;'admin'));&lt;br /&gt;
echo &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//kill the client&lt;br /&gt;
unset($client);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Llistar contactes (classe PHP)==&lt;br /&gt;
Ara faig el mateix que l'anterior exercici però definint una classe PHP.&lt;br /&gt;
&lt;br /&gt;
La classe SugarSoap la defineixo en el fitxer SugarSoap.php:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
define('sugarEntry', TRUE);&lt;br /&gt;
require_once('../include/nusoap/nusoap.php');&lt;br /&gt;
class SugarSoap{&lt;br /&gt;
	var $soapclient;&lt;br /&gt;
	var $proxy;&lt;br /&gt;
	var $sess;&lt;br /&gt;
&lt;br /&gt;
	function SugarSoap(){&lt;br /&gt;
		$soap_url='http://localhost/sugarcrm/soap.php?wsdl';&lt;br /&gt;
		$soapclient = new nusoapclient($soap_url,true);&lt;br /&gt;
		$this-&amp;gt;proxy = $soapclient-&amp;gt;getProxy();&lt;br /&gt;
		$this-&amp;gt;login();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function login(){&lt;br /&gt;
		$auth_array = array(&lt;br /&gt;
			'user_auth' =&amp;gt; array(&lt;br /&gt;
			'user_name' =&amp;gt; 'admin',&lt;br /&gt;
			'password' =&amp;gt; md5('****'),&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
		$result = $this-&amp;gt;proxy-&amp;gt;call('login',$auth_array);&lt;br /&gt;
	    	$this-&amp;gt;sess= $result['error']['number']==0 ? $result['id'] : null;	    &lt;br /&gt;
	    	return $this-&amp;gt;sess;&lt;br /&gt;
	} &lt;br /&gt;
&lt;br /&gt;
	function getContacts($query='',$maxnum=0,$orderby=' contacts.last_name asc'){&lt;br /&gt;
		$contact_array = array(&lt;br /&gt;
			$this-&amp;gt;sess,&lt;br /&gt;
			'Contacts',&lt;br /&gt;
			$query,&lt;br /&gt;
			$orderby,&lt;br /&gt;
			0,&lt;br /&gt;
			array(&lt;br /&gt;
			    'id',&lt;br /&gt;
			    'first_name',&lt;br /&gt;
			    'last_name',&lt;br /&gt;
			    'account_name',&lt;br /&gt;
			    'account_id',&lt;br /&gt;
			    'email1',&lt;br /&gt;
			    'phone_work',&lt;br /&gt;
			),&lt;br /&gt;
			$maxnum,&lt;br /&gt;
			false&lt;br /&gt;
		);&lt;br /&gt;
	    	$result = $this-&amp;gt;proxy-&amp;gt;call('get_entry_list',$contact_array);&lt;br /&gt;
		echo &amp;quot;el mètode response va molt bé per editar errors. Per exemple, si faig referència a un camp que no existeix en el order by&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $this-&amp;gt;proxy-&amp;gt;response.&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
		return $result;&lt;br /&gt;
	}              &lt;br /&gt;
 &lt;br /&gt;
	function nameValuePairToSimpleArray($array){&lt;br /&gt;
	$my_array=array();&lt;br /&gt;
	while(list($name,$value)=each($array)){&lt;br /&gt;
	$my_array[$value['name']]=$value['value'];&lt;br /&gt;
	}&lt;br /&gt;
	return $my_array;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i el fitxer llistar_contactes.php és el que crida a la classe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
require_once &amp;quot;SugarSoap.php&amp;quot;;&lt;br /&gt;
$soap=new SugarSoap(); // we automatically log in&lt;br /&gt;
&lt;br /&gt;
$result=$soap-&amp;gt;getContacts(&amp;quot; contacts.phone_work&amp;lt;&amp;gt;'' &amp;quot;,5,&amp;quot; contacts.last_name desc&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if($result['result_count']&amp;gt;0){ &lt;br /&gt;
    foreach($result['entry_list'] as $record){&lt;br /&gt;
        $array= $soap-&amp;gt;nameValuePairToSimpleArray($record['name_value_list']);&lt;br /&gt;
        echo $array['first_name'] . &amp;quot; &amp;quot; . $array['last_name'] . &amp;quot; - &amp;quot; . $array['email1']. &amp;quot; - &amp;quot; . $array['phone_work']. &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;              &lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;No contacts found&amp;quot;;&lt;br /&gt;
}  &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compte perquè si en el filtre fico &lt;br /&gt;
&lt;br /&gt;
 contacts.email1&amp;lt;&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
falla, i això és perquè no existeix el camp mail1 en la taula ''contacts''. El tractament dels mails és una mica més complexe, és una relació 1:M i els mails estan en la taula ''email_addr_bean_rel'' i el camp ''primary_address''. La consulta que s'envia és&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT count(*) c FROM contacts LEFT JOIN users ON contacts.assigned_user_id=users.id LEFT JOIN accounts_contacts ON contacts.id=accounts_contacts.contact_id and accounts_contacts.deleted = 0 LEFT JOIN accounts ON accounts_contacts.account_id=accounts.id AND accounts.deleted=0 LEFT JOIN email_addr_bean_rel eabl ON eabl.bean_id = contacts.id AND eabl.bean_module = 'Contacts' and eabl.primary_address = 1 and eabl.deleted=0 LEFT JOIN email_addresses ea ON (ea.id = eabl.email_address_id) &lt;br /&gt;
where ( contacts.email1&amp;lt;&amp;gt;'' ) AND contacts.deleted=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i falla perquè&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MySQL error 1054: Unknown column 'contacts.email1' in 'where clause'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analitzant la clàusula SQL veig que he de ficar la línia&lt;br /&gt;
 eabl.primary_address&amp;lt;&amp;gt;''&lt;br /&gt;
i ara sí que puc filtar els contactes que tenen email1&amp;lt;&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Al MySQL, per veure les taules i la descripció de les taules és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; show tables;&lt;br /&gt;
mysql&amp;gt; SHOW FIELDS FROM `contacts`;&lt;br /&gt;
mysql&amp;gt; SHOW FIELDS FROM `email_addr_bean_rel`;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>