2016-06-21 7 views
1

Ich versuche, die Spalte einer Tabelle zu einer Zeichenfolge in jeder Zeile festzulegen, wenn die Spalte vorhanden ist. Allerdings erhalte ich SQL-Syntax-Fehler und kann nicht genau feststellen, was genau das Problem ist:Syntaxfehler mit SQL in PHP

while($db = mysqli_fetch_array(mysqli_query($conn, "SHOW DATABASES"))){ 
    $id = $db['id']; 

    $sql = /** @lang text */ 
      "SELECT IF(EXISTS(
        SELECT DISTINCT `info` 
         FROM INFORMATION_SCHEMA.COLUMNS 
         WHERE COLUMN_NAME IN ('borrower') 
          AND TABLE_SCHEMA = '$db')) 
        BEGIN 
         UPDATE `info` 
          SET `borrower` = '****' 
          WHERE `id` = '$id' 
        END"; 

    $query = mysqli_query($conn, $sql); 

    if (!$query){ 
     // Deal with error 
    } 
} 

Die Syntaxfehler erhalte ich zurück:

information_schema
db1
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 ')
BEGIN
UPDATE info
SET borrower = '****'
' at line 5

Ich weiß, es ist etwas sehr klein sein muss, aber ich sind für eine Weile stecken geblieben und scheinen meinen Fehler nicht zu finden.

+2

'begin/end' ist in gespeicherten Prozeduren nur gültig, nicht in einer allgemeinen' select' Abfrage. was du versuchst zu tun, ist in einem 'select' nicht möglich. select zieht nur Daten aus einer Tabelle heraus. Es kann den Inhalt einer Tabelle oder einer anderen Tabelle nicht ändern. Sie würden 'update ... join' brauchen, und selbst dann kann das nur auf bestimmte Felder zielen, nicht auf arbritary, die aus einem select gezogen wurden. –

+0

Wo also sollte ich meinen 'UPDATE ...' Abschnitt einfügen? – Jodo1992

+1

Was machst du da? Das Datenbankschema abfragen und in eine Tabelle übernehmen - das sieht schrecklich aus –

Antwort

2

Versuchen Sie, diese Syntax für die Abfrage-

IF EXISTS (SELECT DISTINCT `info` 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE COLUMN_NAME IN ('borrower') 
         AND TABLE_SCHEMA = '$db')) THEN 
    UPDATE `info` 
         SET `borrower` = '****' 
         WHERE `id` = '$id' 


    END IF; 

Ich habe Then am Ende der if-Bedingung und End if statt nur if, und ich entfernte die select zu. Was versuchst du auszuwählen? Es ist nur Update-Klausel.

Update

Beispiel von here

you can't use it like a normal query. Control structures like IF or WHILE are only allowed in stored procedures or functions.

MYSQL Panel

delimiter $$ 
create procedure YourIfConditionSP() 
begin 
    IF EXISTS (SELECT DISTINCT `info` 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE COLUMN_NAME IN ('borrower') 
         AND TABLE_SCHEMA = '$db') THEN 
    UPDATE `info` 
         SET `borrower` = '****' 
         WHERE `id` = '$id'; 


    END IF; 
end $$ 
delimiter ; 

Und Sie haben Ihre PHP-Code zu ändern, um die gespeicherte Prozedur für den Aufruf.

PHP

//run the stored procedure 
$result = mysqli_query($connection, 
     "CALL YourIfConditionSP") or die("Query fail: " . mysqli_error()); 

How to call a MySQL stored procedure from within PHP code?

+0

Damit bekomme ich einen anderen Syntaxfehler: 'Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax in der Nähe von 'IF EXISTS (SELECT DISTINCT Informationen von INFORMATION_SCHEMA.COLUMNS' in Zeile 1 ' – Jodo1992

+0

) Sie können nicht verwenden, wenn Bedingung in einer regulären Abfrage, müssen Sie Verwenden Sie es als Speichervorgang. –