Update de la mysql la mysqli

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
PHPoff
Mesaje: 5

Update de la mysql la mysqli

Buna seara,
caut sa inteleg dar nu pot. Am in site acest script care a functionat si functioneaza inca dar nu cu versiuni noi de PHP, cum ar fi 7. Am incercat sa inlocuiesc conectarea la baza de date si e bine(cred) dar mai incolo, am numai erori. Prima parte am schimbat-o asa:

Cod: Selectaţi tot

public function __construct() // conectarea la baza de date
{
  $connection = new mysqli(Config::DB_SERVER,Config::DB_USERNAME,Config::DB_PASSWORD,Config::DB_NAME);  
  if ($connection -> connect_errno) { echo "Failed to connect to MySQL: " . $connection -> connect_error;  exit(); }
}
...mai incolo, nu pricep. Ma ajuta cineva? Multumesc anticipat!

Cod: Selectaţi tot

<?php
class DB
{	
	public function __construct() // conectarea la baza de date
	{
		$connection = mysql_connect(Config::DB_SERVER,Config::DB_USERNAME,Config::DB_PASSWORD)  
			or die(ErrorLog::sql_put("Nu se poate conecta la serverul bazei de date."));		
		mysql_select_db(Config::DB_NAME, $connection)  
			or die(ErrorLog::sql_put("Nu se poate selecta baza de date. Nume gresit pentru baza de date."));		 	
	}
	public static function select($sql) 
	{
		// returneaza un array de obiecte, fiecare obiect repr o inregistrare din tabel
		$res = mysql_query($sql) or die(ErrorLog::sql_put($sql));
		$rows = array();
		while($row = mysql_fetch_object($res))
		{
			array_push($rows,$row);
		}
		return $rows;
	}
	public static function insert($sql)
	{
		mysql_query($sql) or die(ErrorLog::sql_put($sql));
	}
	public static function update($sql)
	{		
		$res = mysql_query($sql) or die(ErrorLog::sql_put($sql));	
	}
	public static function delete($sql)
	{		
		$res = mysql_query($sql) or die(ErrorLog::sql_put($sql));	
	}
	public static function result($sql)
	{		
		$res = mysql_query($sql) or die(ErrorLog::sql_put($sql));	
		return stripslashes(@mysql_result($res,0));
	}
}
?>

MarPlo
Salut,
Ca sa treci scriptul la mtoda MySQLi, in afara de modul de conectare la baza de date trebuie modificate si functiile pentru comenzile sql cu cele din modulul MySQLi. Se modifica toate functiile legate de transmiterea si preluarea datelor sql.

De exemplu, pentru Insert, Update si Delete se poate folosi metoda:

Cod: Selectaţi tot

$conn->query($sql);
- Unde $conn e obiectul MySQLi cu conexiunea la baza de date, iar $sql e sirul cu comanda sql.

Vezi in lectile de pe site desepre cum se lucreaza cu MySQLi, la categoria Php-Mysql.

PHPoff
Multumesc,
am incercat cu metoda din site gen:

Cod: Selectaţi tot

$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('Marius', 'faith', 'name@domain.net')";


eu credeam ca trecerea de la mysql la mysqli are si un avantaj practic dar nu cred. De exemplu in vechiul procedeu nu trebuia sa specifici pe rand, ce vrei sa introduci, era mult mai general, mai rapid. Parerea mea.
Multumesc, e mare bataie de cap caci modificarile nu se rezuma la o pagina ci peste tot e cate ceva de adaptat, in consensuri diferite.

PHPoff
Nu reusesc sa rezolv ultimul, "result". Da mereu eroare. As avea nevoie de o rescriere completa mysql to mysqli a acestei declaratii, sunt numai trei randuri.

Cod: Selectaţi tot

public static function result($sql){		
  $res = mysql_query($sql) or die(ErrorLog::sql_put($sql));	
  return stripslashes(@mysql_result($res,0));
}

MarPlo
Functiile MySQLi folosesc obiectul ce contine conectarea la baza de date, aici $conn (deci trebuie transmis ca argumen la apelarea metodei).
Incearca asa:

Cod: Selectaţi tot

public static function result($sql, $conn){		
  if($res = $conn->query($sql)){
    $res->field_seek(0);
    return $res->fetch_field();
  }
  else echo 'Error: No sql results';
}

PHPoff
Multumesc mult, incep sa ma apropii de solutie (imi place cum arata, seamana cu originalul, asa trebuia sa fac si cu celelalte public functions) insa am o eroare:

Cod: Selectaţi tot

[23-Apr-2020 16:53:54 UTC] PHP Fatal error:  Call to a member function query() on null in linia:   if($res = $conn->query($sql)){

MarPlo
Metoda result() din clasa ta trebuie apelata cu doua argmente: comanda $sql, si obiectul cu conectaea la mysqli ($conn).
Deci, trebuie sa transmiti si acel obiect, care contine conectarea mysqli la baza de date.

PHPoff
Am incercat si alte variante(am gasit un site care modifica din sql in sqli) dar tot la acea linie am eroarea deci pe undeva, in alta parte este buba. Am luat incet, incet si am updatat mai multe declaratii, unele se traduc cu erori gen t_string. Uneia nu pot sa-i dai de cap in niciun fel, vad ca sunt paranteze in minus, incerc sa le inchid dar tot nu iese.
Vechea formula este:

Cod: Selectaţi tot

	public function existEntry($editare = null,$membru = null)
	{		
		if($editare && $membru) $nr = @mysql_result(mysql_query("SELECT count(*) FROM ".$this->table." WHERE ".$this->unique[1]." = '".addslashes($_POST[$this->unique[1]])."' AND ".$this->unique[0]." != '".addslashes($membru)."'   "),0);
		else $nr = @mysql_result(mysql_query("SELECT count(*) FROM ".$this->table." WHERE ".$this->unique[1]." = '".addslashes($_POST[$this->unique[1]])."' OR  ".$this->unique[0]." = '".addslashes($_POST[$this->unique[0]])."'  "),0);
		if($nr) return true;
		else return false;
	}
Versiunea adaptata automat:

Cod: Selectaţi tot

	public function existEntry($editare = null,$membru = null)
	{		
		if($editare && mysql_query("SELECT count(*->data_seek(); $membru) $nr = @mysql_query("SELECT count(*->fetch_array()[0] FROM ".$this->table." WHERE ".$this->unique[1]." = '".addslashes($_POST[$this->unique[1]])."' AND ".$this->unique[0]." != '".addslashes($membru)."'   "),0);
		else mysql_query("SELECT count(*->data_seek(); $nr = @mysql_query("SELECT count(*->fetch_array()[0] FROM ".$this->table." WHERE ".$this->unique[1]." = '".addslashes($_POST[$this->unique[1]])."' OR  ".$this->unique[0]." = '".addslashes($_POST[$this->unique[0]])."'  "),0);
		if($nr) return true;
		else return false;
	}

MarPlo
In mysqli nu se foloseste mysql_query($sql).
Modulul mysqli e bazat pe obiecte si foloseste: $mysqli->query($sql);
Unde $mysqli e obiectul (variabila) care contine conexiunea, nu conteaza numele, eu o foloseam cu $conn.
Trecerea scriptului la mysqli e indicat sa fie facuta manual, sa schimbi fiecare functie care e cu "mysql_..." la echivalentul din mysqli.
Probabil trebuie regandita si strctura clasei sa stochezi conexiunea intr-o proprietate a clasei care o definesti in __construct(), apoi o folosesti in metodele clasei cu $this->conn;
Ceva de genul:

Cod: Selectaţi tot

class DB {
  protected $conn = false;  // stores the connection to database

  public function __construct(){
    if($this->conn = new mysqli(Config::DB_SERVER,Config::DB_USERNAME,Config::DB_PASSWORD,Config::DB_NAME)){
      $this->conn->query('SET character_set_client="utf8",character_set_connection="utf8",character_set_results="utf8";');
    }
    else if(mysqli_connect_errno()) exit('MySQL connection failed: '. mysqli_connect_error());
  }

  public function result($sql){
    if($res = $this->conn->query($sql)){
      $res->field_seek(0);
      return $res->fetch_field();
    }
    else echo 'Error: No sql results';
  }
}
Trecerea la mysqli necesita intai sa cunosti cum se lucreaza cu mysqli, ce functii echivalente sunt, astea le gasesti pe siteul php.net, de exemplu daca vei cauta: mysql_result().

Subiecte similare