Page 1 of 2
Connect to a db via a UDT [SOLVED with work around]
Posted: Thu Mar 22, 2007 6:48 pm
by Gregor
Hello,
Is it possible to connect to a database via a udt? The code in the udt looks like:
The file class_mysql.php has the following function:
Code: Select all
function connect() {
$this->conn_id = mysql_connect($this->dbms['host'].":".$this->port,$this->dbms['user'],$this->dbms['pass']);
if ($this->conn_id == 0) {
$this->sql_error("Connection Error, kan geen verbinding met DB maken");
}
if (!mysql_select_db($this->dbms['dbName'], $this->conn_id)) {
$this->sql_error("Database Error");
}
return $this->conn_id;
}
The error that occurs is that it is "Database Error". I checked the parameters that are in the UDT, and they are correct. Am I overlooking something, knowing that I'm not a php-programmer
Thanks for your help.
G
Re: Connect to a db via a UDT
Posted: Thu Mar 22, 2007 9:08 pm
by Vin
Huh? UDTs are not php files, they are actually stored in the database...if you store the code in the files, you create plugins... (OK, that was a little quimble

)
Try $db = &$gCms->db; to connect to the cmsms database. That works

.
Re: Connect to a db via a UDT
Posted: Thu Mar 22, 2007 9:26 pm
by Gregor
Thanks Vin, but oeps, you're losing me....
This is the whole code, 2 parts. The first code I put in a User Defined Tag without the php-tag and put in a template, like {poll_include} The seconde part, I also put in a UDT, and called it {poll}.
Code: Select all
<?php
/* Include this before your html code */
include_once "./poll_cookie.php";
?>
Code: Select all
<?php
/* path */
$poll_path = dirname(__FILE__);
require_once $poll_path."/include/config.inc.php";
require_once $poll_path."/include/$POLLDB[class]";
require_once $poll_path."/include/class_poll.php";
$CLASS["db"] = new polldb_sql;
$CLASS["db"]->connect();
$php_poll = new poll();
/* the first poll */
echo $php_poll->poll_process(1);
?>
If I understand you correct... than it is not possible to have the code in the UDT? Where should I put it??? Second, your
$db = &$gCms->db;
is that a replacement for the function or for the $CLASS?
Thanks for your help,
G
Re: Connect to a db via a UDT
Posted: Thu Mar 22, 2007 10:16 pm
by Dee
Try closing the db (add $CLASS["db"]->close_db(); at the end of the script):
Code: Select all
<?php
/* path */
$poll_path = dirname(__FILE__);
require_once $poll_path."/include/config.inc.php";
require_once $poll_path."/include/$POLLDB[class]";
require_once $poll_path."/include/class_poll.php";
$CLASS["db"] = new polldb_sql;
$CLASS["db"]->connect();
$php_poll = new poll();
/* the first poll */
echo $php_poll->poll_process(1);
$CLASS["db"]->close_db();
?>
If that doesn't work, re-open the CMSMS database connection (add adodb_connect(); at the end of the script):
Code: Select all
<?php
/* path */
$poll_path = dirname(__FILE__);
require_once $poll_path."/include/config.inc.php";
require_once $poll_path."/include/$POLLDB[class]";
require_once $poll_path."/include/class_poll.php";
$CLASS["db"] = new polldb_sql;
$CLASS["db"]->connect();
$php_poll = new poll();
/* the first poll */
echo $php_poll->poll_process(1);
adodb_connect();
?>
Regards,
D
Re: Connect to a db via a UDT
Posted: Fri Mar 23, 2007 5:31 am
by Gregor
Thanks for you suggestion, Dee.
Both your suggestions leeds to this error:
Fatal error: Call to a member function on a non-object in /home/httpd/vhosts/uisge-beatha.eu/httpdocs/lib/content.functions.php(669) : eval()'d code on line 16
The code in {include_poll} is:
Code: Select all
/* Include this before your html code */
include_once "/home/httpd/vhosts/uisge-beatha.eu/httpdocs/poll/poll_cookie.php";
I placed this tag here:
Code: Select all
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<__html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<!-- Change lang="en" to the language of your site -->
<head>
<!-- UDT voor het poll-systeem 21mrt07 -->
{include_poll}
<title>{sitename} - {title}</title>
<!-- The sitename is changed in Site Admin/Global settings. {title} is the name of each page -->
The code in {poll} is (after Dee's suggestion):
Code: Select all
/* path */
$poll_path = "/home/httpd/vhosts/uisge-beatha.eu/httpdocs/poll";
require_once $poll_path."/include/config.inc.php";
require_once $poll_path."/include/$POLLDB[class]";
require_once $poll_path."/include/class_poll.php";
$CLASS["db"] = new polldb_sql;
$db =& $gCms->polldb_sql;
/* $CLASS["db"]->connect(); */
$db =& $gCms->db;
/* the first poll */
echo $php_poll->poll_process(1);
adodb_connect();
I placed this tag in the navigation section of the template, because for now I'd like to have under the menu.
Based on the error, I think it error's at this line:
BTW, to see it working outside CMSMS
http://www.uisge-beatha.eu/poll/demo_1.php
I created a test template that is not accessable through the menu:
http://www.uisge-beatha.eu/index.php?page=test
Any suggestions for improvement?
Thanks so far,
Gregor
Re: Connect to a db via a UDT
Posted: Sun Mar 25, 2007 12:17 pm
by Gregor
Hello,
Without trying to be to impatient

does someone have a suggestion how to take it from here?
Thanks for your help,
G
Re: Connect to a db via a UDT
Posted: Sun Mar 25, 2007 2:31 pm
by Vin
Well, you can use either the way of the $gCms variable (which is global, so you have to call it as global $gCms; first) and use its functions, or to connect to the database with your own.
That $db = &$gCms->db; is due to the access to the adodb functions AND cmsms stuff -
http://wiki.cmsmadesimple.org/index.php/User_Handbook/Admin_Panel/Extensions/User_Defined_Tags.
So that error is IMHO caused by omitting the global $gCms; but it's not neccessary to use this. Try Dee's solution without using the $gCms.
Re: Connect to a db via a UDT
Posted: Sun Mar 25, 2007 3:37 pm
by Gregor
Thanks! I read the Wiki, however I find it difficult to understand since I'm not a programmer. Removing "&$gCms->" leads to the same error as mentioned previous.
I noticed, that the error occurs on this line:
Code: Select all
/* the first poll */
echo $php_poll->poll_process(1);
Any suggestions I might try?
Thanks for thinking with me to find a solution.
G
Re: Connect to a db via a UDT
Posted: Sun Mar 25, 2007 5:35 pm
by Vin
Ah, I didn't look carefully... you'd already posted where the line is.
Hmm, the error says that there is a member function call on a non-object... are you sure you'd initialized the variable $php_poll?
Gregor wrote:
Code: Select all
<?php
/* Include this before your html code */
include_once "./poll_cookie.php";
?>
Code: Select all
<?php
/* path */
$poll_path = dirname(__FILE__);
require_once $poll_path."/include/config.inc.php";
require_once $poll_path."/include/$POLLDB[class]";
require_once $poll_path."/include/class_poll.php";
$CLASS["db"] = new polldb_sql;
$CLASS["db"]->connect();
$php_poll = new poll();
/* the first poll */
echo $php_poll->poll_process(1);
?>
Aren't you missing the $php_poll = new poll(); you'd had once?
Re: Connect to a db via a UDT
Posted: Sun Mar 25, 2007 5:56 pm
by Gregor
oops
We are improving. It now says that it has a database error.
Database Error
MySQL Error : Database Error
Error Number: 1046 No Database Selected
Date : Sun, March 25, 2007 19:52:49
IP : 83.84.87.33
Browser : Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2
Referer :
PHP Version : 4.3.11
OS : Linux
Server : Apache
Server Name :
www.uisge-beatha.eu
Script Name : /index.php
I copied your code (Vin). It seems that the variables are not passed (are we back where we started

) Reading the Wiki, I don't get the picture of how to pass the variables from the UDT to external php-software.
http://www.uisge-beatha.eu/index.php?page=test
Gregor
Re: Connect to a db via a UDT
Posted: Mon Mar 26, 2007 7:59 pm
by Vin
It was your own code, you just omit a variable by accident...
If the UDT is the issue, then you can try making it as a plugin (a flat php file).
You'd have to wrap the whole code in a
Code: Select all
function_smarty_cms_function_<the name of the tag>($params, &$smarty){
<the code>
}
and place it into the /plugins/ folder.
However, me thinks the issue is somewhere else... is the database selected properly? I don't know the code of the poll, so I can't say if you do refer to the right variables and functions...
Re: Connect to a db via a UDT
Posted: Tue Mar 27, 2007 5:20 am
by Gregor
Thanks for your repley Vin!
Just a quick reply. I'll have a look at your suggestion (what an optionns does cmsms have

).
It errors on the line:
Code: Select all
if (!mysql_select_db($this->db['dbName'], $this->conn_id)) {
The file that is called from the udt, is "class_mysql.php"i:
Code: Select all
<?php
/**
* ----------------------------------------------
* Advanced Poll 2.0.7 (PHP/MySQL)
* Copyright (c) Chi Kien Uong
* URL: http://www.proxy2.de
* ----------------------------------------------
echo $POLLDB["dbName"];
echo $POLLDB["host"];
echo $POLLDB["user"];
echo $POLLDB["pass"];
echo $POLLDB["class"];
*/
class polldb_sql {
var $conn_id;
var $result;
var $record;
var $db;
var $port;
var $query_count;
function polldb_sql() {
global $POLLDB;
$this->query_count=0;
$this->db = $POLLDB;
if(ereg(":",$this->db['host'])) {
list($host,$port) = explode(":",$this->db['host']);
$this->port = $port;
} else {
$this->port = 3306;
}
}
function connect() {
$this->conn_id = mysql_connect($this->db['host'].":".$this->port,$this->db['user'],$this->db['pass']);
if ($this->conn_id == 0) {
$this->sql_error("Connection Error, kan geen verbinding met DB maken");
}
if (!mysql_select_db($this->db['dbName'], $this->conn_id)) {
$this->sql_error("Database Error");
}
return $this->conn_id;
}
function query($query_string) {
$this->result = mysql_query($query_string,$this->conn_id);
$this->query_count++;
if (!$this->result) {
$this->sql_error("Query Error");
}
return $this->result;
}
function fetch_array($query_id) {
$this->record = mysql_fetch_array($query_id,MYSQL_ASSOC);
return $this->record;
}
function num_rows($query_id) {
return ($query_id) ? mysql_num_rows($query_id) : 0;
}
function num_fields($query_id) {
return ($query_id) ? mysql_num_fields($query_id) : 0;
}
function free_result($query_id) {
return mysql_free_result($query_id);
}
function affected_rows() {
return mysql_affected_rows($this->conn_id);
}
function close_db() {
if($this->conn_id) {
return mysql_close($this->conn_id);
} else {
return false;
}
}
function sql_error($message) {
$description = mysql_error();
$number = mysql_errno();
$error ="MySQL Error : $message\n";
$error.="Error Number: $number $description\n";
$error.="Date : ".date("D, F j, Y H:i:s")."\n";
$error.="IP : ".getenv("REMOTE_ADDR")."\n";
$error.="Browser : ".getenv("HTTP_USER_AGENT")."\n";
$error.="Referer : ".getenv("HTTP_REFERER")."\n";
$error.="PHP Version : ".PHP_VERSION."\n";
$error.="OS : ".PHP_OS."\n";
$error.="Server : ".getenv("SERVER_SOFTWARE")."\n";
$error.="Server Name : ".getenv("SERVER_NAME")."\n";
$error.="Script Name : ".getenv("SCRIPT_NAME")."\n";
echo "<b><font size=4 face=Arial>$message</font></b><hr>";
echo "<pre>$error</pre>";
exit();
}
}
?>
Re: Connect to a db via a UDT
Posted: Tue Mar 27, 2007 3:04 pm
by Gregor
Something funny occured (no, it's not working, yet

)
The code in the UDT is:
Code: Select all
global $gCms;
$db =& $gCms->GetDb();
/* path */
$poll_path = "/home/httpd/vhosts/uisge-beatha.eu/httpdocs/poll";
require_once $poll_path."/include/config.inc.php";
require_once $poll_path."/include/$POLLDB[class]";
require_once $poll_path."/include/class_poll.php";
$CLASS["db"] = new polldb_sql;
$CLASS["db"]->connect();
$php_poll = new poll();
/* the first poll */
echo $php_poll->poll_process(1);
$CLASS["db"]->close_db();
When viewing the page using
http://www.uisge-beatha.eu/index.php?page=test it does not give an error (neither a poll), but when using the preview from page 'test', it gives "Database error".

Re: Connect to a db via a UDT
Posted: Tue Mar 27, 2007 3:09 pm
by Vin
Try to uncomment the lines on the beginning:
Code: Select all
echo $POLLDB["dbName"];
echo $POLLDB["host"];
echo $POLLDB["user"];
echo $POLLDB["pass"];
echo $POLLDB["class"];
*/
to check the values.
P.S.: I'm unable to reach your server.
Re: Connect to a db via a UDT
Posted: Tue Mar 27, 2007 3:33 pm
by Gregor
Removed the /* */ (except for [pass]

) It looks like the correct variables are passed on, however the connect() function does not recognize them.
I can reach my server. Strange
