2012-09-10 9 views
5

Sto cercando di ri-hash ID utente nel mio database, ma mi sto bloccando.Errore di sintassi MySQL, ma solo quando si utilizza tramite PHP

<?php 
include("session.php"); 
include("functions.php"); 
$conn = ConnectMySQL(); 
setTimezone($session->username); 

$sql = "SELECT username, userid FROM users"; 
$result = mysql_query($sql) or die(mysql_error()); 
while($rows = mysql_fetch_array($result)){ 
    $username = $rows['username']; 
    $old = mysql_real_escape_string($rows['userid']); 
    $new = mysql_real_escape_string($session->generateRandID()); 

    $moresql = "START TRANSACTION; 
       UPDATE users SET userid='$new' WHERE userid='$old'; 
       UPDATE comments SET user='$new' WHERE user='$old'; 
       UPDATE forum_posts SET poster_name='$new' WHERE poster_name='$old'; 
       UPDATE forum_topics SET topic_poster_name='$new' WHERE topic_poster_name='$old'; 
       UPDATE images SET author='$new' WHERE author='$old'; 
       UPDATE likes SET user='$new' WHERE user='$old'; 
       UPDATE music SET author='$new' WHERE author='$old'; 
       UPDATE ratings SET user='$new' WHERE user='$old'; 
       COMMIT;"; 
    $newresult = mysql_query($moresql) or die(mysql_error()); 
    if(!$newresult){echo "There was a problem with changing $username's hash. \n";} 
    else{echo "Changed $username's hash<i>!</i> \n";} 
} 
mysql_close($conn); 
?> 

L'intera query funziona perfettamente con PHPMyAdmin, restituisce ovviamente zero righe. Ma quando provo con valori effettivi di essere passati attraverso di essa utilizzarlo con PHP ottiene succhiare:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE users SET userid='b8aca4b680707453fa4dfe1bf1d0fddb' WHERE userid='8' at line 2 

Non ci sono altri errori - Sono in perdita di pensare a quello che è. Grazie in anticipo,

Sam

+0

Completamente estranei, ma il vostro 'if (! $ newresult)' linea sarà mai essere eseguito perché il caso in cui '$ newresult' è uguale a' FALSE' è già coperto da 'o die (mysql_error());'. Solo qualcosa da tenere a mente. – Palladium

risposta

2

Dal documentation:

mysql_query() sends a unique query (multiple queries are not supported) 

È cant't inviare una serie di interrogazioni al database tramite php. Prendi in considerazione la possibilità di scrivere una procedura sul tuo database attuale e poi chiamarla da php.

Inoltre, tali funzioni sono deprecate. Dovresti considerare una libreria diversa. PDO è popolare.

1

L'idea che io di solito uso quando si lavora con le transazioni si presenta così (-pseudo-codice semi):

try { 
    // First of all, let's begin a transaction 
    $db->beginTransaction(); 

    // A set of queries ; of one fails, an exception should be thrown 
    $db->query('first query'); 
    $db->query('second query'); 
    $db->query('third query'); 

    // If we arrive here, it means that no exception was thrown 
    // i.e. no query has failed ; and we can commit the transaction 
    $db->commit(); 
} catch (Exception $e) { 
    // An exception has been thrown 
    // We must rollback the transaction 
    $db->rollback(); 
} 

Si noti che, con questa idea, se una query non riesce, un'eccezione deve essere gettato:

DOP possono farlo, a seconda di come lo si configura See DOP :: setAttribute e PDO :: ATTR_ERRMODE e PDO :: ERRMODE_EXCEPTION altro, con qualche altra API, potrebbe essere necessario verificare il risultato della funzione utilizzata per eseguire una query e generare un'eccezione autonomamente.

Sfortunatamente, non c'è alcuna magia implicata: non puoi semplicemente mettere un'istruzione da qualche parte e fare operazioni automaticamente: devi ancora specificare quale gruppo di query deve essere eseguito in una transazione.

Ad esempio, molto spesso, ci saranno un paio di domande prima della transazione (prima dell'inizio), e un altro paio di query dopo la transazione (dopo il commit o il rollback); e vorrai che tali query vengano eseguite indipendentemente da ciò che è accaduto (o meno) nella transazione.

========================================= =======

È possibile utilizzare mysqli anche per raggiungere lo stesso

per ex

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 
Problemi correlati