2016-10-19 4 views
0

Ich habe die folgende SQL-Anweisung, die als Arbeitsprüft wurde:Was ist die korrekte Syntax für diese PHP-basierte SQL-Anweisung?

INSERT INTO community_players (community_id, player_id) 
SELECT communities.id, users.id 
FROM communities INNER JOIN users ON communities.admin = users.user_email 
WHERE users.user_email = '[email protected]' 
AND communities.code = 'HX99f9' 

ich jetzt die Dummy-E-Mail-und Community-Codedaten mit den Variablen in der unter PHP-Funktion ersetzt werden soll, und sie in die Datenbank eintragen.

Dies ist meine Funktion:

public function insertNewAdminIntoCommunity($email, $code) 
{ 
$sql = "insert into community_players (community_id, player_id) select communuities.id, users.id from communuities inner join users on communities.admin = users.user_email where users.user_email = '".$email."' and communities.code = '".$code."'"; 
$statement = $this->conn->prepare($sql); 

if(!$statement) throw new Exception($statement->error); 

$statement->bind_param("ss", $email, $code); 
$returnValue = $statement->execute(); 

return $returnValue; 
} 

aber es Fehler wieder in Xcode werfen - II dachte, vielleicht habe ich eine falsche Syntax, wenn die Variablen in der Funktion innerhalb der SQL-Anweisung zu verwenden versuchen?

Irgendwelche Ideen?

Dank

+1

versuchen Sie, PDO zu verwenden? Was ist dein Verbindungsobjekt? Bitte auch Fehler anzeigen. –

Antwort

2

Sie sollten nicht die Variablen in die SQL-Zeichenfolge verketten, wie Sie hier tun:

users.user_email = '".$email."' and communities.code = '".$code."'"; 

als dass der ganze Zweck der vorbereiteten Anweisungen besiegt. Vorbereitete Anweisungen helfen beim Schutz vor SQL-injection, indem Sie Platzhalter definieren können, die durch korrekt maskierte Werte ersetzt werden.

Daher sollten Sie verwenden Platzhalter (Fragezeichen, ohne umliegendes Anführungszeichen):

users.user_email = ? and communities.code = ?"; 

Was $statement->bind_param("ss", $email, $code); dann tut, ist Ihre Variablen an die beiden Platzhalter binden. Jede s des ersten Arguments bedeutet, dass die entsprechenden Werte als eine Zeichenfolge behandelt werden sollen. MySQL kümmert sich darum, die Werte auf diese Weise zu umgehen.

Der Fehler daher wahrscheinlich, dass Sie versuchen, Werte an nicht vorhandene Platzhalter zu binden.


  1. die mysqli_stmt::bind_param() documentation für mehr verfügbaren Optionen auswählen.
0

Sie haben ein communuities in einigen Bereichen und Gemeinden in anderen sicher, dass Sie den richtigen Tabellennamen

$sql = "insert into community_players (community_id, player_id) 
     select communuities.id, users.id 
     from communuities 
     inner join users on communities.admin = users.user_email 
     where users.user_email = '".$email."' and communities.code = '".$code. "'"; 

in jedem Fall verwenden und ich schlage vor, die Verwendung PDO mit param statt String concat verbindlich. . (und andere Verbindungen)

Verwandte Themen