2017-10-01 7 views
-1

Ist meine Anfrage machbar?MySql Einfügen mit Bedingung

Ich möchte die Einfügung mit dem Passwort des Admin sichern.

INSERT INTO `user` (`id`, `pw`, `name`) VALUES (?,?,?) WHERE EXISTS (select * from `admin` where pw=?) 

Danke.

+3

Es ist mir überhaupt nicht klar, was das zu erreichen ist. Was erwarten Sie, dass dies anders ist als nur ein normales 'INSERT'? – David

+1

Das Testen des Administratorstatus durch Überprüfen des Kennworts bei jeder einzelnen SQL-Operation ist äußerst riskant. Dies bedeutet, dass Sie ihr Passwort nicht richtig hashed haben, denn wenn Sie dies tun müssten, würden Sie Bcrypt oder Scrypt verwenden, was MySQL nicht unterstützt. – tadman

Antwort

1

Ja - aber Sie sollten die SELECT Form von INSERT

INSERT INTO `user` (`id`, `pw`, `name`) 
SELECT ?,?,? FROM dual WHERE EXISTS (select * from `admin` where pw=?) 
+0

Können Sie die Gründe für diese Änderung erklären? Ich sage nicht, dass du falsch liegst, aber es wäre schön zu wissen, was * wir tun können * warum * sollten wir es tun. – Pshemo

+1

Ich glaube nicht, dass Sie der INSERT ... VALUES-Anweisung eine WHERE-Klausel hinzufügen können - aber Sie können eine WHERE-Klausel im INSERT ... SELECT-Formular haben. Dafür gibt es keinen besonderen Grund, denn so wurde die Sprache definiert. –

1

ich diese als schreiben würde dazu neigen, verwenden:

INSERT INTO `user`(`id`, `pw`, `name`) 
    SELECT x.id, x.pw, x.name 
    FROM (SELECT ? as id, ? as pw, ? as name) x 
    WHERE EXISTS (select 1 from `admin` a where a.pw = x.pw); 

Beachten Sie, dass Sie benötigen, um zweimal beinhalten nicht die pw Parameter (Ich gehe davon aus, dass dies die Logik ist, die Sie wollen).

Noch wichtiger, Sie scheinen sicher zu sein, dass pw in admin richtig gültig ist. Der eigentliche Weg, dies zu tun, ist mit einem Fremdschlüssel:

alter table user add constraint fk_user_pw 
    foriegn key (pw) references admin(pw); 

Dann brauchen Sie keine spezielle Logik im insert. Es schlägt fehl, wenn die pw Werte nicht übereinstimmen.

Besser noch, das funktioniert für update sowie insert.

+0

SQL-weise liefern Sie hier eine gute Antwort, aber den Admin-Status zu testen, indem Sie ein Passwort verifizieren, das vermutlich Klartext oder schlecht gehackt ist, ist wirklich eine sehr schlechte Idee. – tadman