MySQL via PHP Script

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Patrick1993.

    MySQL via PHP Script

    Hallo Community,
    Ich habe mir von einem Freund ein Skript geben lassen mit dem ich mit VB.NET auf eine MySQL Datenbank ohne Externen zugriff zugreifen kann.
    Hier das PHP Script:

    PHP-Quellcode

    1. <?php
    2. error_reporting(E_ALL);
    3. ini_set('display_errors', 1);
    4. $db = @new MySQLi('localhost', 'benutezrname', 'password', 'd00fd7ff');
    5. if (mysqli_connect_errno())
    6. {
    7. die('Es konnte keine Verbindung zur Datenbank hergestellt werden.<br />'.mysqli_connect_error());
    8. }
    9. if (isset($_POST['art'], $_POST['Title'], $_POST['Inhalt']) or isset($_POST['ID'], $_POST['art']))
    10. {
    11. if ($_POST['art'] == 'Edit')
    12. {
    13. $id = trim($_POST['ID']);
    14. $titel = utf8_decode(trim($_POST['Title']));
    15. $inhalt = utf8_decode(trim($_POST['Inhalt']));
    16. $sql = "UPDATE
    17. News
    18. SET
    19. Titel = ?,
    20. Inhalt = ?
    21. WHERE
    22. ID = ?";
    23. $stmt = $db->prepare($sql);
    24. if ($stmt)
    25. {
    26. $stmt->bind_param('sss', $title, $inhalt, $id);
    27. if ($stmt->execute()) echo utf8_encode('Änderungen erfolgreich übernommen.');
    28. else die('Fehler '.$stmt->error);
    29. }
    30. else
    31. {
    32. die('Fehler'.$db->error);
    33. }
    34. }
    35. elseif ($_POST['art'] == 'Add')
    36. {
    37. $titel = utf8_decode(trim($_POST['Title']));
    38. $inhalt = utf8_decode(trim($_POST['Inhalt']));
    39. $sql = "INSERT INTO
    40. News(Titel, Datum, Inhalt)
    41. VALUES
    42. (?, NOW(), ?)";
    43. $stmt = $db->prepare($sql);
    44. if (!$stmt)
    45. {
    46. die('Fehler '.$sql);
    47. }
    48. else
    49. {
    50. $stmt->bind_param('ss', $titel, $inhalt);
    51. if (!$stmt->execute())
    52. {
    53. die('Fehler '.$stmt->error);
    54. }
    55. else
    56. {
    57. echo utf8_encode('Der Eintrag wurde erfolgreich hinzugefügt.');
    58. }
    59. }
    60. }
    61. elseif ($_POST['art'] == 'Delete')
    62. {
    63. $id = trim($_POST['ID']);
    64. $sql = "DELETE FROM
    65. News
    66. WHERE
    67. ID = ?";
    68. $stmt = $db->prepare($sql);
    69. if ($stmt)
    70. {
    71. $stmt->bind_param('s', $id);
    72. if ($stmt->execute()) echo utf8_encode('Die News wurden erfolgreich gelöscht.');
    73. else die('Fehler '.$stmt->error);
    74. }
    75. else
    76. {
    77. die('Fehler '.$db->error);
    78. }
    79. }
    80. }
    81. else
    82. {
    83. $sql = "SELECT
    84. *
    85. FROM
    86. News
    87. ORDER BY
    88. Datum DESC";
    89. $result = $db->query($sql);
    90. if (!$result)
    91. {
    92. die('Kein Result für '.$sql);
    93. }
    94. else
    95. {
    96. while($row = $result->fetch_assoc())
    97. {
    98. $ret = $row['ID'].'|'.$row['Titel'].'|'.$row['Inhalt'].'~';
    99. echo $ret;
    100. }
    101. }
    102. }
    103. ?>


    und hier der Code der in C# geschrieben aber auf VB Übersetzt wurde den ich in VB Einfüge um zugriff auf die Datenbank mittels dem Skript bekomme:

    VB.NET-Quellcode

    1. Dim nv As New NameValueCollection()
    2. nv.Add("ID", _id)
    3. nv.Add("art", "Edit")
    4. nv.Add("Title", txtTitle.Text)
    5. nv.Add("Inhalt", rtxtInhalt.Text)
    6. Dim b_arr As Byte() = New WebClient().UploadValues("http://rv-zaisenhausen.de/php/news/inc/api.inc.php", "POST", nv)
    7. Dim encstring As String = Encoding.UTF8.GetString(b_arr)
    8. MessageBox.Show(encstring)
    9. Me.DialogResult = DialogResult.OK



    Nun mein Problem:
    Wie komme ich genau über das Skript auf die Datenbank ??
    Ich habe schon vieles Versucht was SELECT * FROM und INSERT TO ... anbetrifft doch ich komme nicht weiter. Ein anderer Freund der ebenfallf VB Programmiert sagte ich solle:

    VB.NET-Quellcode

    1. Dim cion As New Connection

    für eine neue Verbindung nutzen und

    VB.NET-Quellcode

    1. Dim cmd As NEW MySQL Command

    Nutzen.
    Doch das wurde mir nicht gesagt somit hab ichs gelassen.
    Nun habe ich genug geschrieben hoffe ihr könnt mir helfen.

    MFG
    Patrick

    New Connection und New Command brauchst du nicht, das wäre nur für eine lokale bzw. extern Errichbare SQL Datenbank, du kommunizierst über ein Script und da ist ist dein Ansatz schon richtig.

    Aber was genau ist nun deine Frage? Du hast im Script fertige SQL Queries definiert, so kommst du auch an die Datenbank, indem du entsprechende Parameter im POST angibst um einen Eintrag zu erstellen, editieren oder löschen.

    Edit: Das PHP Script sieht reichlich unübersichtlich aus, aber soweit ich das erkenne wird eine Ansicht generiert wenn du KEINE Variablen über POST angibst.
    Wobei das Zeichen "~" als Zeilentrenner definiert ist und das Zeichen "|" als Spaltentrennung. Was natürlich ungünstig ist wenn in dem Text in der SQL Datenbank auch jene Zeichen vorkommen.

    Wenn du kein Gehirnschmalz dafür verbraten willst und/oder nicht die nötigen Kenntnisse in VB und PHP mitbringst, kannst du auch auf meine Lib zurück greifen, die macht genau das, nur eben optimiert, mit Fehlerabfangen und als Result bekommst du eine schöne Klasse wo dann die Informationen auslesen kannst, die du benötigst.

    [Release] OpenMySqlLib 2.2 - MySQL sicher über ein PHP Script
    Wenn ich es in einem Projekt einfüge und SELECT * FROM xy eingebe dann kommt eine Fehlermeldung.
    Warum ?? <-- gleicht meiner Frage.

    Das Script ist wie gesagt nicht von mir.

    Wie funktionirt das mit deinem Lib ?? Ich habs auf meinem PC.

    Wenn ich es bei dir richtig gelesen habe muss ich quasi nur:

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Private db As New MySqlLib.MySql("http://localhost/vb/sql/query.php")
    3. Private myResult As MySqlLib.MySql.MySqlResultList

    in den Namespace eingeben und

    VB.NET-Quellcode

    1. Try
    2. myResult = db.Query(TextBox1.Text)
    3. ListView1.Columns.AddRange(myResult.ToColumnHeader())
    4. ListView1.Items.AddRange(myResult.ToItemCollection())
    5. DataGridView1.DataSource = myResult.ToDataTable()
    6. Catch sqlex As MySqlLib.MySql.MySqlException
    7. MsgBox(sqlex.ToString())
    8. Catch scriptex As MySqlLib.MySql.ScriptException
    9. MsgBox(scriptex.Message)
    10. End Try


    In z.b. den Button oder muss das in jeden Button

    Das muss überall hin, wo du einen SQL Query ausführen willst und was du eigentlich nur brauchst ist diese Zeile

    VB.NET-Quellcode

    1. myResult = db.Query("SELECT * FROM `tabelle`")


    Hier wird der Query ausgeführt und das Ergebnis in der ResultCollection gespeichert, die anderen Zeilen sind, wie man deutlich sieht, bloß Zuweisungen zu einem ListView und DataGrid, was du natürlich nicht schreiben musst, wenn du das nicht nutzt, du kannst auch ganz normal auf einzelne Zellen des Reults zugreifen

    VB.NET-Quellcode

    1. MsgBox(MyResult.Rows(Zeile).Columns("spaltenname"))


    Wobei Zeile natürlich für die entsprechende Zeile steht (achtung Nullbasiert, heißt die erste Zeile hat den Index 0) und "spaltenname" für den Spaltennamen in der SQL Tabelle.
    Also muss ich den Code

    VB.NET-Quellcode

    1. Try
    2. myResult = db.Query(TextBox1.Text)
    3. ListView1.Columns.AddRange(myResult.ToColumnHeader())
    4. ListView1.Items.AddRange(myResult.ToItemCollection())
    5. DataGridView1.DataSource = myResult.ToDataTable()
    6. Catch sqlex As MySqlLib.MySql.MySqlException
    7. MsgBox(sqlex.ToString())
    8. Catch scriptex As MySqlLib.MySql.ScriptException
    9. MsgBox(scriptex.Message)
    10. End Try

    und halt die Anweisungen

    VB.NET-Quellcode

    1. myResult = db.Query("SELECT * FROM `tabelle`")

    einfügen ??
    Reicht es wenn ich den Code nur ein die Form packe oder muss der Code in z.b. Jeden Button ??

    Okay, du versteht es nicht, ich würde dir raten erstmal die Grundlagen zu lernen, denn du weißt anscheint absolut nicht was dort passiert und Lehrer spielen möchte ich nicht, die Lib ist schon sehr sehr vereinfacht.

    Ich gebe dir einen guten, ernst gemeinten Rat, LERNE DIE GRUNDLAGEN. Ansonsten hat alles was ich hier rede wenig Sinn, weil du es eh nicht verstehen würdest und nur mit einem Code weiterkommst, denn ich 100% richtig für dich schreiben würde, da ich dies aber nicht tue und ich auch ein gewissen grundlegendes Interesse und Eigeninitiative schätze, klinke ich mich hier aus. Du hast alles was du brauchst, jetzt musst es nur noch verstehen und dann kannste auch Eigenständig weitermachen.
    1. Ich habe mich MIT DEN GRUNDLAGEN bescäftigt ich habe mir nicht umsonst das Buch dazu gekauft.
    2. Ich habe lediglich gefragt ob es genügt den Code in die Form einzufügen oder ob er in z.b. jeden Button incl. Statements muss. Mehr habe ich nicht gefragt

    Das zeigt mir aber das du es eben nicht verstanden hast, denn ansonsten würdest du diese Frage nicht stellen weil sie total unlogisch ist, bzw. darauf ankommt was du machen willst, das kann man nicht so Pauschal sagen wohin das muss.
    Das muss eben dahin wo es gebraucht wird, wo Daten aus der Datenbank geholt werden sollen.
    kurz und knapp gesagt:
    Code da einfügen wo Daten in die Datenbank oder aus der Datenbank geholt werden sollen.
    Beispiel:
    Button XY in exe1 trägt in Datenbank ein dann kommt der Code in den Button XY und in der 2exe dann halt ins Label oder Textbox.

    So hab ich es verstanden.
    Nun genug des ganzen bevor wieder gesagt wird ich hätte es nicht verstanden

    Das es so verstanden hast, darauf lässt deine 2. Frage jedoch nicht schließen wenn du fragst ob es genügt den code in die Form (Form_Load Event) zu packen.

    Ansonsten, einfach probieren, kaputt machen kann man nichts, probieren ist immer das beste.
    Die 2.Frage kam von mir ja weil es ein freund von mir gesagt hat und da ich es nicht wirklich glauben wollte/konnte hab ich halt nachgefragt

    Wenn du den Code verstanden hättest, kann dein Freund soviel sagen wie er möchte, einzig und alleine die Logik hätte dir diese Frage beantwortet. Zumal hat dein Freund wohl die falsche Informationen wenn er dir Begriffe die New Connection usw. nennt denn würde es sich um einen externen oder lokalen Zugriff handeln, dann hätte er auch recht, weil die Connection müsste wirklich nur einmal im Form_Load aufgebaut werden, DB Abfragen aber natürlich überall wo Daten geholt werden. Da er also nicht weiß dass dies über ein PHP Script geschieht hat er dir die Info mit dem Form_load gegeben.
    Das mit den Lokalen also ConnectionString etc weiss ich doch da ich auf meinem Server keinen Externen Zugriff habe was die DB anbetrifft habe ich mich in php verkukt da die meisten sagten es were sicherer

    Viel sicherer nicht, da man die Script Adresse aussuchen und dann manuell Query Strings an das Script schicken kann. Mit meiner Lib wird aber schonmal die Verbindung verschlüsselt, so das niemand mithören kann und auch nicht direkt an das PHP Script Querys kann. Wer diese Dll von mir jedoch selbst herunterläd oder sie aus deinem Programm nimmt, kann genauso auf die Datenbank zugreifen, das werde ich jedoch mit der Dll Version 3 ändern, so das NUR das Programm auf das Script zugreifen kann, aber bis sie fertig ist, dauerts noch etwas.
    Gut.
    Nun ist hier vorerst zu. Ich werde mich mal dran begeben und deine Lib versuchen "zu knacken" sprich ich fange nun mal an zu tüfteln. Falls ich Probleme bekomme melde ich mich wieder

    Scheint auf jeden einfacher zu sein als ich dachte.