Elxis CMS Forum

Support => Database => Topic started by: jimmyz on May 25, 2020, 00:20:20

Title: Παράλληλη εγγραφή σε δεύτερη database
Post by: jimmyz on May 25, 2020, 00:20:20
Χαίρετε, Χριστός Ανέστη!

Παρακαλώ πολύ για την βοήθειά σας:

Στον ίδιο σέρβερ που φιλοξενεί την Elxis εγκατάστασή μου, τρέχω παράλληλα μια υπηρεσία instant messenging. Θα ήθελα οι χρήστες της σελίδας, με την εγγραφή τους, να αποκτούν ταυτόχρονα και λογαριασμό χρήστη στον instant messenger. Θα πρέπει λοιπόν, κατά την εγγραφή στο Elxis, το όνομα χρήστη και ο κωδικός, (σε plain text) να γράφονται παράλληλα και στην database του messenger (είναι τα μόνα που χρειάζονται).
Επιπροσθέτως, κατά την ανάκτηση ενός ξεχασμένου κωδικού, όταν ενημερώνεται το πεδίο pword στο elx_users, να γίνεται η αλλαγή και στην δεύτερη database. Ομοίως και κατά την αλλαγή του κωδικού από τον ίδιο το χρήστη.

Μπορείτε να με βοηθήσετε;
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: datahell on May 25, 2020, 21:28:15
Είναι πολύ εύκολο να συνδεθείς σε μία δεύτερη βάση και να κάνεις αυτό που θες. Ωστόσο επειδή πρόκειται για custom-ιά θα πρέπει να τροποποιήσεις τις default επεκτάσεις του Elxis που σημαίνει ότι σε μία αναβάθμιση μπορεί να τις χάσεις αν υπερκαλυφθούν τα αρχεία.

Σύνδεση στη δεύτερη βάση (αλλάξε host αν χρειάζεται καθώς και username/password)
$params = array(
   'dbtype' => 'mysql',
   'host' => 'localhost',
   'port' => 0,
   'dbname' => 'my_other_database',
   'username' => 'db_username',
   'password' => 'db_pass'
);
$db2 = new elxisDatabase($params);

Μετά εκτελείς τα queries ως συνήθως:
$sql = "INSERT INTO ".$db2->quoteId('my_table')." VALUES (NULL, 'blah', 'blah', 'blah')";
$stmt = $db2->prepare($sql);
$stmt->execute();

components/com_user/controllers/account.php
Μετά τη γραμμή 237:
if ($ok === true) {
Συνδέσου στη βάση db2
Και εκτέλεσε το INSERT στη δεύτερη βάση. Όλα τα στοιχεία του χρήστη είναι διαθέσιμα στη μεταβλητή $row. Επειδή το password το έχει το Elxis κρυπτογραφημένο θα το πάρεις ως plain text από τη μεταβλητή $pword. Κάπως έτσι:

$sql = "INSERT INTO ".$db2->quoteId('my_table')." VALUES (NULL, ".$db2->quote($row->uname).", ".$db2->quote($pword).")";
$stmt = $db2->prepare($sql);
$stmt->execute();

Το id του χρήστη είναι αυτό: $row->uid
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: jimmyz on May 26, 2020, 11:17:25
Ευχαριστώ για την άμεση απάντηση.  :)

components/com_user/controllers/account.php, πάνω και κάτω από την 237:
Code: [Select]
$params = array(
   'dbtype' => 'mysql',
   'host' => 'localhost',
   'port' => 0,
   'dbname' => 'etest',
   'username' => 'db2user',
   'password' => 'db2pass'
);
$db2 = new elxisDatabase($params);


if ($ok === true) {

$sql = "INSERT INTO ".$db2->quoteId('my_table')." VALUES (NULL, ".$db2->quoteId($row->uname).", ".$db2->quoteId($pword).")";
$stmt = $db2->prepare($sql);
$stmt->execute();

Για username TEST1, γράφει σωστά τον νέο χρήστη στην db του elxis, καμία εγγραφή στην etest, δίνει HTTP ERROR 500 και στο log καταφράφει:
Code: [Select]
Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'TEST1' in 'field list'' in /var/www/mysite.gr/includes/libraries/elxis/database/statement.class.php:41
Stack trace:
#0 /var/www/mysite.gr/includes/libraries/elxis/database/statement.class.php(41): PDOStatement->execute(NULL)
#1 /var/www/mysite.gr/components/com_user/controllers/account.php(255): elxisPDOStatement->execute()
#2 /var/www/mysite.gr/components/com_user/user.php(61): accountUserController->register()
#3 /var/www/mysite.gr/includes/libraries/elxis/document.class.php(1183): userRouter->route()
#4 /var/www/mysite.gr/includes/libraries/elxis/document.class.php(953): elxisDocument->renderComponent()
#5 /var/www/mysite.gr/includes/loader.php(245): elxisDocument->make()
#6 /var/www/mysite.gr/index.php(18): require('/var/www/mysit...')
#7 {main}
  thrown

 
 
Ακόμη και αν αλλάξω σε
$sql = "INSERT INTO db2table (uname, pword) VALUES (TEST1, TEST2)";
παίρνω το ίδιο σφάλμα, νομίζει οτι το username που θέλει ο χρήστης, είναι στήλη στο table!

Δοκίμασα, να αφαιρέσω τα ", αλλά δεν είχα τύχη.

Τί προτείνετε;
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: michalis1984 on May 26, 2020, 15:34:19
Τα values δεν πρέπει να είναι σε quotes? 'value'

$sql = "INSERT INTO db2table (uname, pword) VALUES ('TEST1', 'TEST2')";

έτσι δουλεύει;


Here are some syntax rules to follow:

The SQL query must be quoted in PHP
String values inside the SQL query must be quoted
Numeric values must not be quoted
The word NULL must not be quoted
Source: https://www.w3schools.com/php/php_mysql_insert.asp
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: jimmyz on May 26, 2020, 16:55:04
Αυτό λειτουργεί.
$sql = "INSERT INTO my_table (uname, pword) VALUES ('TEST1', 'TEST2')";

Πώς όμως πρέπει να γίνει το
$sql = "INSERT INTO ".$db2->quoteId(my_table)." VALUES (NULL, ".$db2->quoteId($row->uname).", ".$db2->quoteId($pword).")";
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: datahell on May 26, 2020, 21:42:10
$sql = "INSERT INTO ".$db2->quoteId('my_table')." VALUES (".$db2->quote($row->uname).", ".$db2->quote($pword).")";

ή (hardcoded για Mysql):

$sql = "INSERT INTO `my_table` VALUES ('".$row->uname."', '".$pword."')";

Tip: Οι μέθοδοι quoteId και quote προσθέτουν τα "αυτάκια" αυτόματα σε ονομασίες πινάκων και τιμές ανάλογα με τον τύπο της βάσης δεδομένων.
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: jimmyz on May 27, 2020, 22:23:18
Χοντροκέφαλος ήμουνα πάντα!
Ευχαριστώ πολύ για τις υποδείξεις σας!

Δουλεύει:
Code: [Select]
/* Για την εγγραφή χρήστη */
   $params = array(
   'dbtype' => 'mysql',
   'host' => 'localhost',
   'port' => 0,
   'dbname' => 'etest',
   'username' => 'db2user',
   'password' => 'db2pass'
);
$db2 = new elxisDatabase($params);

if ($ok === true) {        // γραμμή 237

$sql = "INSERT INTO my_table (username, password) VALUES ('$row->uname', '$pword')";
$stmt = $db2->prepare($sql);
$stmt->execute();
/* Τέλος για την εγγραφή χρήστη */

Δουλεύει, τοποθετημένο αμέσως μετά την (αρχικά) 453:
Code: [Select]
/* Για την επαναφορά κωδικού χρήστη */
   $params = array(
   'dbtype' => 'mysql',
   'host' => 'localhost',
   'port' => 0,
   'dbname' => 'etest',
   'username' => 'db2user',
   'password' => 'db2pass'
);
$db2 = new elxisDatabase($params);
$sql = "UPDATE my_table SET password='$newpass' WHERE username='".$row->uname."'";
$stmt2 = $db2->prepare($sql);
$stmt2->execute();
/* Για την επαναφορά κωδικού χρήστη */

Μένει να βρω πού γίνεται η αλλαγή του κωδικού από τον ίδιο το χρήστη, αλλά δεν είναι και τόσο σημαντικό.
Σημαντικό είναι να σας πω ένα μεγάλο ευχαριστώ!

Μετά από όσα έμαθα (αποδεδειγμένα), διεκδικώ μια θέση στην ομάδα του σκληρού πυρήνα προγραμματισμού του Έλξις!  ;D
Title: Re: Παράλληλη εγγραφή σε δεύτερη database
Post by: datahell on May 28, 2020, 22:35:39
Μετά από όσα έμαθα (αποδεδειγμένα), διεκδικώ μια θέση στην ομάδα του σκληρού πυρήνα προγραμματισμού του Έλξις!  ;D

Άντε, με το καλό. Και εμείς βοήθεια θέλουμε  :)