SQL-Befehl anzeigen

Thomas_Jung

Erfahrenes Mitglied
Hallo,

ich möchte mir den SQL-Befehl anzeigen lassen.


$sql = "UPDATE kunden SET name = 'Donald Duck', adresse = 'Entenhausen' WHERE name = 'Emil Entenich'";
mysql_query($sql);
echo $sql;
Ergebnis ist: UPDATE kunden SET name = 'Donald Duck', adresse = 'Entenhausen' WHERE name = 'Emil Entenich'



wie kann ich mir bei diesem Beispiel den SQL-Befehl anzeigen lassen.

$stmt = $mysqli->prepare("UPDATE movies SET filmName = ?,
filmDescription = ?,
filmImage = ?,
filmPrice = ?,
filmReview = ?
WHERE filmID = ?");
$stmt->bind_param('sssdii',
$_POST['filmName'],
$_POST['filmDescription'],
$_POST['filmImage'],
$_POST['filmPrice'],
$_POST['filmReview'],
$_POST['filmID']);
$stmt->execute();
$stmt->close();

echo prepare ???

Gruß Thomas
 
Hi
einfach nur crack

Ich möchte einen Datensatz updaten mit dem folgenden Befehl:

PHP:
if ($insert_stmt = $mysqli->prepare("UPDATE tj_members SET username = ?, email = ?  WHERE id = ?")) {
$insert_stmt->bind_param('ssi', $username, $email, $_POST['update_id']);
if ($insert_stmt->execute()) { echo 10; } else { echo 100; }
}

Das Problem ist das alle Datensätze in der Tabelle aktualisiert werden.
Und nicht nur die id von $_POST['update_id'].

Es muß doch eine Möglichkeit geben den Befehl (Ausführung) anzeigen zu lassen. :mad::mad::mad:
 
Alxy, das bezieht sich aber auf PDO und nicht auf MySQLi!
Es wird lediglich auf das Duplikat verwiesen, in wechem es um PDO geht. Das Problem bleibt allerdings das Selbe (Prepared Statements). Siehe dazu auch den Beginn der Frage:
I'm using the mysqli extension in PHP and I'm wondering, is there possibly any way to see a prepared query as it will be executed on the server, e.g. The query is something like this
 
Das Ding bleibt eben, dass die „fertige SQL-Query“ bei Prepared Statements prinzipbedingt nie existiert. (Abgesehen von so Details, dass PDO für MySQL unter Umständen überhaupt nie echte Prepared Statements durchführt.)

Das heißt, jeder Ansatz, eine „fertige SQL-Query“ zu basteln, schafft ein künstliches Konstrukt, das der Datenbanktreiber selbst überhaupt nicht nutzt. Da bleibt so ein wenig die Frage, welchen Wert das dann fürs Debugging hat.

PS: Ich vermute, die Problemursache hier im Thread ist nicht in den gezeigten Zeilen zu finden.
 
Zuletzt bearbeitet:
Man kann auch für mysqli Code schreiben, der die Ersetzungen manuell vornimmt.

Es ist aber schwierig, das exakt hinzubekommen, weil man einerseits die SQL-Syntax nachvollziehen müsste und andererseits auch die Logik, nach der die Extension Datentypen umwandelt.

Grundsätzlich ist das wie gesagt ohnehin mit Vorsicht zu genießen, weil es eben genau das Prinzip von Prepared Statements ist, Struktur und Daten zu trennen und eben nicht zu vereinen.

Hier mal eine 90-%-Lösung für mysqli. Rechnet nicht damit, dass das unter allen Umständen exakt arbeitet.

PHP:
<?php

/**
 *
 *
 * Caution: The interpolation is an approximation.
 *
 * @param mysqli $mysqli
 * @param string $query
 * @param string $types
 * @param array $params
 * @return string
 * @throws Exception
 */
function x_mysqli_interpolate_prepared_statement(
    mysqli $mysqli,
    $query,
    $types,
    array $params
) {
    if (!is_string($query)) {
        throw new Exception('$query has to be of type string');
    }

    if (!is_string($types)) {
        throw new Exception('$types has to be of type string');
    }

    if (strlen($types) !== count($params)) {
        throw new Exception(
            'Number of type definitions does not match number of params'
        );
    }

    $replacements = array();

    $i = 0;
    foreach ($params as $param) {
        switch ($types[$i]) {
            case 'i':
                $replacements[] = (int) $param;
                break;
            case 'd':
                $replacements[] = (float) $param;
                break;
            case 's':
            case 'b':
                $replacements[] = sprintf(
                    "'%s'",
                    $mysqli->real_escape_string($param)
                );
                break;
            default:
                throw new Exception(
                    'Unknown type definition (expects i, d, s, b)'
                );
                // no break
        }

        $i++;
    }

    // TODO: '?' chars inside of SQL syntax strings or comments should be
    // ignored
    $tmp = explode('?', $query);

    if (count($tmp) !== count($params) + 1) {
        throw new Exception(
            'Number of placeholders does not match number of params'
        );
    }

    $interpolatedQuery = $tmp[0];

    for ($i = 0; $i < count($replacements); $i++) {
        $interpolatedQuery .= $replacements[$i] . $tmp[$i + 1];
    }

    return $interpolatedQuery;
}



$mysqli = new mysqli('localhost', 'user', 'pass', 'database');

$query = 'UPDATE tj_members SET username = ?, email = ? WHERE id = ?';

$types = 'ssi';

$params = array(
    'Lucas Barrios',
    'lucas@barrios.example.org',
    1909
);

var_dump(
    x_mysqli_interpolate_prepared_statement($mysqli, $query, $types, $params)
);
// string(101) "UPDATE tj_members SET username = 'Lucas Barrios', email = 'lucas@barrios.example.org' WHERE id = 1909"

Anmerkungen, Testcases usw. wie immer gerne.
 
Zurück