2016-05-06 11 views
-1

複数のクエリを実行するPHPを作成します。私はすべてのクエリを保存する必要があるので、私はトランザクションをしたいと思います。重要なのはすべてのデータを保存することです。私は取引の仕方を知らない。私はそれに従ってきた:PHP + MySQL transactions examplesしかし、それは動作していません。MySQLでのPHPのトランザクション?

これは私の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); 
?> 

私のデータベースはphpmyadminのと、同じサーバーです。 私を助けてくれてありがとう!

+0

[Little Bobby](http://bobby-tables.com/)は[あなたのスクリプトはSQLインジェクション攻撃の危険性があると言います。](http://stackoverflow.com/questions/60174/how-can-i -prevent-sql-injection-in-php)を実行します。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+1

[mysql_ *関数の使用をやめてください](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。 [これらの拡張機能](http://php.net/manual/en/migration70.removed-exts-sapis.php)はPHP 7で削除されました。[prepared](http:// en。wikipedia.org/wiki/Prepared_statement)[PDO](http://php.net/manual/en/pdo.prepared-statements.php)と[MySQLi](http://php.net/manual/en /mysqli.quickstart.prepared-statements.php)、PDOの使用を検討してください。[これは本当に簡単です](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+0

どのテーブルタイプを使用していますか?それはInnoDBですか? –

答えて

1

私はこの回答を得たいと思いますが、トランザクションクエリを使用する理由はありませんが、理由を説明する前に、ここで指摘したいことがいくつかあります。

まず、

mysqlPHP 5.5以降廃止されています。より新しいキッカーのバージョンは、mysqliです。つまり、mysqliはすべてであり、mysqlであるため、mysqlを使用する理由はこれ以上ありません。

EDIT: @Jayが述べたところでは、これでは十分ではありません。変数を囲む必要があります単一引用符で囲みます。さらに連結した方が良いでしょう...さらに、usernameのようなフォームに入るべき値の種類がわかっている場合は、preg_replaceを使用してコードに変換することができます。

第二に、ポイント#1を実装した後

は、あなたのポスト変数をエスケープしてみてください。 mysqli_real_escape_stringのようなものは、挿入クエリを実行しているときに何か例外がポップアップするのを防ぐのに不思議です。さらに、mysqli_real_escape_stringを使用する際の最も重要な点は、データベースの注入を完全に防ぐことです。したがって、すぐに使用し始める必要があります。

第三に、

は、手続きを使用して一緒にOOPしないようにしてください、それは非常に厄介なコードになります。 1つを選択してそれに固執し、あるものから別のものに変更したい場合は、コードの全ページで変更します。

最後に、

リンクされたようなトランザクションのクエリが存在する理由は、あなたがそうでないの複数のクエリを実行し、プロジェクトとコードのためのものです。さらに、文字列をエスケープすると、すべてのクエリが完全に実行されます。トランザクショナルクエリが必要な唯一のタイミングは、大量の挿入、更新、または削除を実行しているときです.1つのことが起これば、システム全体がクラッシュする可能性があります。

お使いのシステムではこのように思われません。

+0

私のPHPで少しの例を教えてください。mysqli_real_escape_stringで正しく_POSTを使用する方法を教えてください。それは私がすべての大丈夫を理解するのに役立つだろう! –

+1

[文字列のエスケープ](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではないことをご存知ですか? [PDO](http://php.net/manual/en/pdo.prepared-statements.php)と[MySQLi(英語)]の[prepared](http://en.wikipedia.org/wiki/Prepared_statement) ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)、PDOの使用を検討してください。[とても簡単です](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+0

** TIL **。私は通常、変数を連結しました。言及を忘れてしまった。また、@FederickJonsでは '$ sqlcon'があなたの' 'mysqli_connect()'接続であれば '$ horaSeleccionada = mysqli_real_escape_string($ sqlcon、$ _POST ['horaSeleccionada']);のようなものを試すことができます。 –

関連する問題