Page 1 sur 1

Transformation problématique sqli en PDO

Posté : 08 janv. 2021, 17:04
par Sebasto
Bonjour,

Ce n'est pas une question habituelle mais une demande d'aide clé en main pour cause de problème de langue.

Je m'explique. Grâce à un pote Espagnol, nous avons un projet finalisé de plateforme de membres (avec une nouvelle table de membres) et qui marche parfaitement sur un serveur qu'il a créé pour nous chez lui (mais pas sur notre serveur local ni sur notre hébergeur).
Chance il est un professionnel en codage sql-php (pour nous c'est gratis).
Malchance majeure il ne parle ni Français ni Anglais et on correspond via le traducteur Google.
Cela a été OK pour expliquer notre projet mais injouable quand il s'agit d'aller dans les détails de codage (où se trouve le diable comme chacun sait).

Il travaille en sqli et pas en PDO et on aurait besoin d'un expert de ce forum pour faire la traduction (pas avec Google... je plaisante!).

Nous avons plusieurs requêtes sql à "traduire" en PDO, mais la plus importante concerne l'accès à la base de données sur la page d'accueil de cette plateforme car là nous avons une erreur qui n'a rien à voir avec le code php et qui bloque tout.

J'insiste : nous avons déjà une BDD qui fonctionne nickel mais actuellement les membres inscrits y accèdent selon un mode manuel sans table "membres" dans la BDD.

Donc pour sa page de plateforme de membres (login, inscription, PW oublié, etc.) il a écrit le code suivant en essayant d'adapter en PDO (mais cela ne marche pas):
<?php
$v_editor_name = "xxxxx";
$editor_email = "yyyyyy";
$v_url = "zzzzzzz";
$v_web_name = "ttttt";
$v_pages_dir = "ppppppp";

session_start();
error_reporting(E_ALL);
require ("z007/aaaz-connect.php");
// ci dessus le fichier connect qui contient les données de $PARAM_hote, de $PARAM_port, de $PARAM_nom_bd, de $PARAM_utilisateur, de $PARAM_mot_passe 

try {
    $pdo = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}

require('headermysql.php');
// header est un fichier contenant les meta et les include de haut de page en php, rien concernant la BDD

/************************************************************************/
if (isset($_SESSION['action'])) {
	$_POST['action'] = $_SESSION['action'];
	unset($_SESSION['action']);
}
/************************************************************************/
if (isset($_POST['action'])) {
	switch ($_POST['action']) {

		case "Login":
			require('check_user.php');
			break;

		case "Registration":
			require('form_registration.php');
			break;

		case "Validation":
			require('validation_inscription.php');
			if (isset($_SESSION['message'])) {
				// Redirect
				$_SESSION['action'] = "Registration";
				header("Location: ".$_SERVER['PHP_SELF']);
				exit;
			} else {

				// Success
			}
			break;

		case "Password_forgotten":
			echo "<form method='post'>";
			echo "Email: <input type='text' name='email' /><br />";
			echo "<input type='submit' name='action' value='Renew_password' /><br />";
			echo "</form>";
			break;

		case "Renew_password":
			require('renew_password.php');
			break;

		default:
			// Print & delete messages
			if (isset($_SESSION['message'])) {
				echo $_SESSION['message']."<br />";
				unset($_SESSION['message']);
			}

			break;
	}
}

/********************************************************************************************************/
if (isset($_SESSION['user']['user'])) {

	// Authorized visitor
	include('page_authorized_visitor.php');
	
} else {

	// Unauthorized visitor
	require('login.php');
	include('page_unauthorized_visitor.php');

}
En comparaison:
Pour info, actuelllement, nos pages d'accès à la base de données avec requêtes en PDO sont du type suivant (et elles marchent depuis longtemps):
<?php
	error_reporting(E_ALL);
    require ("z007/aaaz-connect.php");
    try {
        $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(
	PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    } catch (Exception $e) {
        echo 'Erreur : ' . $e->getMessage() . '<br />';
        echo 'N° : ' . $e->getCode();
    }
//code php
$requete = $connexion->prepare("SELECT Used_names, Correct_names, Current_trinom_name, Current_status FROM tablebase1 left outer join tablebase2 on (tablebase1.Rk_Hist = tablebase2.Rk_Hist) left outer join tablebase3 on (tablebase3.Rk_Hist = tablebase2.Rk_Hist) WHERE tablebase1.Rk_Hist and Used_names is not null and trim(Used_names) != ''");
	$requete->bindParam(':Rk_Hist', $Rk_Hist, PDO::PARAM_INT);
	
    $requete->execute();
    $result[1] etc.
	
?>
Voilà, bien sûr nous n'avons pas de connaissance MySql... en espérant qu'un expert pourra nous aider!

Seb

Re: Transformation problématique sqli en PDO

Posté : 09 janv. 2021, 17:05
par Sebasto
Bonjour,

Comme il n'y a aucune réaction pour ce fil je crois qu'il doit y avoir un malentendu.
Nous ne demandons pas de faire ou refaire le code, nous demandons de vérifier notre adaptation de sqli vers PDO pour seulement la requête et si elle est fausse de la corriger.
try {
$pdo = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Peut-être est-elle bonne! Mais comme nous n'accrochons pas la base de données, nous en doutons.

Au départ nous avions des requêtes sqli du type:
mysqli_connect($v_server, $v_user, $v_password, $v_db);
mysqli_set_charset($link, "utf8mb4");

Donc nous avons navigué à vue.

Voilà si pas de réponse pas de souci, pas d'oblig.

Seb

Re: Transformation problématique sqli en PDO

Posté : 20 janv. 2021, 15:53
par Ryle
Salutations !
En fait ton besoin n'est pas très clair... tu parles d'un problème de requête liée au passage de MySQLi vers PDO en nous montrant un code PDO sans requête (juste la connexion à la base), puis tu précises que cela fonctionne par ailleurs en nous montrant une requête (qui au demeurant n'exploite pas le paramètre qui est envoyé :)) et tu termines en revenant sur les paramètres de connexion à MySQLi...

C'est un peu perturbant et on ne sait pas trop si c'est un problème de connexion à la base de données (mais si ça fonctionne sur d'autres pages, ça serait étonnant), un problème de requête SQL une fois connecté, voire un problème de structure de la table interrogée...

Il faudrait donc essayer de nous en dire plus (alors certes c'est pas facile parce quand on a pas les bons termes et google fait pas encore de trad métier/dev ;)), en nous indiquant déjà le résultat obtenu par rapport à celui attendu (comment tu sais que ça ne fonctionne pas ?) et les messages d'erreur éventuels (ça nous aide beaucoup à comprendre pourquoi ça ne fonctionne pas) :)