2016-05-06 10 views
-1

Ich erstelle eine PHP, die mehrere Abfragen ausführen. Ich möchte eine Transaktion machen, weil ich die gesamte Abfrage speichern muss, wenn alles in Ordnung ist, wenn nicht ein Rollback. Ist kritisch, speichern Sie alle Daten. Ich weiß nicht, wie ich die Transaktion machen soll. Ich habe das verfolgt: PHP + MySQL transactions examples aber es funktioniert nicht.Transaktion in PHP mit MySQL?

Das ist mein php:

<?php 

require_once __DIR__ . '/connect_to_database.php'; 

$db = new DB_CONNECT(); 

$response = array(); 

$horaSeleccionada= $_POST['horaSeleccionada']; 
$fechaElegida= $_POST['fechaElegida']; 
$data1FK= $_POST['data1FK']; 
$reservado= $_POST['reservado']; 
$usuarioFK= $_POST['usuarioFK']; 
$nombreAuxiliar= $_POST['nombreAuxiliar']; 
$fechaDeReserva= $_POST['fechaDeReserva']; 
$telefonoAux= $_POST['telefonoAux']; 
$anioHoy = (int) $_POST['anioHoy']; 
$filasAfectadas = 0; 
$consultasRealizadas = 0; 

$fecha = date_create($fechaElegida); 
$anioAuxiliar = (int) $fecha->format("Y"); 

while($anioHoy == $anioAuxiliar){ 
    $fechaAGuardar = (String) $fecha->format('Y-m-d'); 

    $query_search = "insert into table(hora, data1FK, usuarioFK, reservado, fecha, nombreAuxiliar, fechaDeReserva, telefonoAux) values ('$horaSeleccionada','$data1FK','$usuarioFK','$reservado','$fechaAGuardar','$nombreAuxiliar','$fechaDeReserva','$telefonoAux')"; 

    $result = mysql_query($query_search) or die(mysql_error()); 

    if(mysql_affected_rows()>0){ 
     $filasAfectadas++; 
    } 
    else{ 
     $response["success"] = 0; 
     $response["mensaje"] = "Hubo un error"; 
     break; 
    } 

    $consultasRealizadas++; 

    date_add($fecha, date_interval_create_from_date_string('7 days')); 
    $anioAuxiliar = (int) $fecha->format("Y"); 
} 

if($consultasRealizadas == $filasAfectadas && $consultasRealizadas!=0){ 
    $response["success"] = 1; 
    $response["mensaje"] = "Todo ok"; 
} 
else { 
    $response["success"] = 0; 
    $response["mensaje"] = "Hubo un error"; 
} 
echo json_encode($response); 
?> 

Meine Datenbank in demselben Server befindet, mit phpMyAdmin. Danke, dass du mir geholfen hast!

+0

[Little Bobby] (http://bobby-tables.com/) sagt [Ihr Skript ist für SQL Injection Attacks gefährdet.] (Http://stackoverflow.com/questions/60174/how-can-i -prevent-sql-injection-in-php). Sogar [die Zeichenfolge zu entkommen] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) ist nicht sicher! –

+1

Bitte [stoppen Sie mit mysql_ * 'Funktionen] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php). [Diese Erweiterungen] (http://php.net/manual/en/migration70.removed-exts-sapis.php) wurden in PHP 7 entfernt. Erfahren Sie mehr über [prepared] (http: // en.wikipedia.org/wiki/Prepared_statement) Anweisungen für [PDO] (http://php.net/manual/en/pdo.prepared-statements.php) und [MySQLi] (http://php.net/manual/en /mysqli.quickstart.prepared-statements.php) und erwäge die Verwendung von PDO, [es ist wirklich ziemlich einfach] (http://jayblanchard.net/demystifying_php_pdo.html). –

+0

Welchen Tabellentyp verwenden Sie? Ist es InnoDB? –

Antwort

1

Ich werde für diese Antwort auf Shat auf, aber es gibt keinen Grund für Sie, Transaktionsabfragen zu verwenden, aber bevor ich erklären kann, warum, hier sind ein paar Dinge, die ich hervorheben möchte. Zum einen

,

mysql seit PHP 5.5 veraltet. Die neuere und mehr Kickass-Version davon ist mysqli. Das heißt, es gibt keinen Grund mehr, mysql zu verwenden, da mysqli alles und mehr von mysql ist.

EDIT: Was @Jay erwähnt, das ist nicht genug. Sie müssen die Variable in einzelnen Anführungszeichen umgeben. Noch besser, wenn Sie es auch verketten ... Außerdem, wenn Sie wissen, welche Art von Werten Sie in einem Formular bekommen sollten, wie username alphanumerisch, können Sie preg_replace verwenden, um sicherzustellen, dass nur alphanumerische es zum Code macht.

Zweitens

Nach Punkt 1 Implementierung, versuchen Sie Ihre Post Variablen zu entkommen. Etwas wie mysqli_real_escape_string wirkt Wunder, indem es verhindert, dass irgendwelche Ausnahmen auftauchen, wenn Sie Ihre Einfüge-Abfrage ausführen. Der wichtigste Punkt bei der Verwendung von mysqli_real_escape_string ist, dass Datenbankinjektionen vollständig verhindert werden, daher sollten Sie sofort damit beginnen.

Drittens

Versuchen Sie nicht prozeduralen zu verwenden und zusammen OOP, macht es für einen sehr unordentlich Code. Wählen Sie einen, bleiben Sie dabei und wenn Sie von einem zum anderen wechseln möchten, tun Sie dies mit der ganzen Code-Seite.

Schließlich

Der Grund, warum transaktionale Abfragen wie die, die Sie existiert verknüpft, ist für Projekte und Codes, die mehrere Abfragen ausführt, von denen Sie nicht. Wenn Sie Ihren String gut umgehen, werden alle Abfragen perfekt ausgeführt. Die einzige Zeit, in der Sie Transaktionsabfragen benötigen, ist, wenn Sie Masseninserts, -aktualisierungen oder -löschungen ausführen, bei denen, wenn eine Sache aufflackert, dies möglicherweise das ganze System zum Absturz bringen könnte.

Ihr System scheint das nicht zu erfordern.

+0

Könnten Sie ein kleines Beispiel mit meinem PHP geben, wie man _POST mit mysqli_real_escape_string richtig benutzt, bitte. Es wird mir helfen, alles zu verstehen, ok! –

+1

Wussten Sie, dass sogar [die Zeichenkette entkommen] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) nicht sicher ist? Besser zu empfehlen [vorbereitet] (http://en.wikipedia.org/wiki/Prepared_statement) Anweisungen für [PDO] (http://php.net/manual/en/pdo.prepared-statements.php) und [MySQLi ] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und erwäge die Verwendung von PDO, [es ist wirklich ziemlich einfach] (http://jayblanchard.net/demystifying_php_pdo.html). –

+0

** TIL **. Ich habe die Variablen normalerweise verkettet. Vergessen, das zu erwähnen. Auch @FederickJons, können Sie versuchen, etwas wie $ horaSeleccionada = mysqli_real_escape_string ($ sqlcon, $ _POST ['horaSeleccionada']); vorausgesetzt, $ sqlcon ist Ihre 'mysqli_connect()' Verbindung. –

Verwandte Themen