Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie do bazy
Forum PHP.pl > Forum > Przedszkole
Dukov
Wszystko już jest na dobrej drodze, problem mam jeszcze z zapytaniem do bazy
  1. <?php
  2. $avatar;
  3. if ($_POST['name'] != null){
  4. $userName = $_POST['name'];
  5. }
  6. if ($_POST['city'] != null ) {
  7. $userCity = $_POST['city'];
  8. }
  9. if ($_POST['desc'] != null){
  10. $userDesc = $_POST['desc'];
  11. }
  12.  
  13. if ($_POST['login'] != '' && $_POST['pass'] != '' && $_POST['mail'] != '') {
  14.  
  15.  
  16. if (strlen($_POST['login']) > 3 && strlen($_POST['login']) < 10 && strlen($_POST['pass']) > 5 && strlen($_POST['pass']) < 16 ) {
  17. if (preg_match('/^[a-zA-Z0-9\.\-_]+\@[a-zA-Z0-9\.\-_]+\.[a-z]{2,4}$/D', $_POST['mail']) && preg_match('/^[a-zA-Z0-9\.\-_]/', $_POST['login']) ) {
  18.  
  19.  
  20. $userLogin = $_POST['login'];
  21. $userPass = $_POST['pass'];
  22. $userMail = $_POST['mail'];
  23. $len = 20;
  24. $userID = substr(sha1(rand(1,10000)),0,$len);
  25. echo $userID;
  26. if($_FILES['filename']['name'] != ''){
  27. $avatar = fileReceive();
  28. }
  29. reg();
  30. }
  31. else
  32. {
  33. header("Location: ../reg.php?reg=badchars");
  34. }
  35. }
  36. else
  37. {
  38. header("Location: ../reg.php?reg=shortpole");
  39. }
  40. }
  41. else
  42. {
  43. header("Location: ../reg.php?reg=emptyf");
  44. }
  45. function reg(){
  46. global $userID, $userMail, $userPass, $userLogin, $userDesc, $userCity, $userName, $avatar;
  47. try {
  48. $host = 'localhost';
  49. $baza = 'user';
  50. $uzytkownik = 'adamek';
  51. $haslo = 'aaaaa5';
  52.  
  53.  
  54. $conn = new PDO("mysql:host=$host;dbname=$baza", $uzytkownik, $haslo);
  55. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  56. $stmt = $conn->prepare("SELECT Nazwa AND mail FROM Users WHERE Nazwa = '$userLogin' OR mail = '$userMail'");
  57. $stmt->execute();
  58. $row = $stmt->fetch();
  59. if($row['Nazwa'] == 0 && $row['mail'] == 0){
  60. $stmt = $conn->exec("INSERT INTO Users ( ID , Nazwa , Haslo , mail , name , city , image , desci , activate , admin ) VALUES ('$userID','$userLogin', '$userPass', '$userMail', '$userName', '$userCity, $avatar', '$userDesc', 0 , 0 ");
  61.  
  62. echo "ok";
  63. #$sendMail();
  64. }
  65.  
  66. else{
  67. header("Location: ../reg.php?reg=userexists");
  68. }
  69. }
  70. catch(PDOException $e)
  71. {
  72. echo "duppppp";
  73. }
  74. }
  75.  
  76.  
  77.  
  78.  
  79. function fileReceive(){
  80. $max_size = 1024*1024;
  81. if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
  82. if ($_FILES['filename']['size'] > $max_size) {
  83. echo 'Błąd! Plik jest za duży!';
  84. }
  85. else {
  86. echo 'Odebrano plik. Początkowa nazwa: '.$_FILES['filename']['name'];
  87. echo '<br/>';
  88. if (isset($_FILES['filename']['type'])) {
  89. echo 'Typ: '.$_FILES['filename']['type'].'<br/>';
  90. }
  91. $strExt = substr( $_FILES['filename']['name'], strrpos( $_FILES['filename']['name'], '.' ) + 1 );
  92. echo "Rozszerzenie: ". $strExt;
  93. $len = 20;
  94. $randstring = substr(sha1(rand(1,10000)),0,$len).".jpg";
  95. echo $randstring;
  96. echo $_FILES['filename']['name'];
  97.  
  98. if ($strExt == 'jpg' || 'JPG' || 'jpeg' || 'JPEG'){
  99. move_uploaded_file($_FILES['filename']['tmp_name'],
  100. $_SERVER['DOCUMENT_ROOT'].'/avatars/'.$_FILES['filename']['name']);
  101.  
  102. }
  103. else{
  104. echo "niy!!";}
  105. }
  106. } else {
  107. echo 'Błąd przy przesyłaniu danych!';
  108. }
  109.  
  110. rename('../avatars/'.$_FILES['filename']['name'], "../avatars/". $randstring);
  111. return $randstring;
  112. }
  113.  
  114.  
  115.  
  116. function sendMail(){
  117. $addressee = 'ajjambor912@gmail.com';
  118. @$email = $_POST['email'];
  119.  
  120. @$content = 'Name '.$_POST['username'].' Phone: '.$_POST['userphone'].' Content: '.$_POST['message'];
  121.  
  122. $header = "From: ".$_POST['email']." \nContent-Type:".
  123. ' text/plain;charset="iso-8859-2"'.
  124. "\nContent-Transfer-Encoding: 8bit";
  125. if (mail($addressee, 'Message from NAhandyman: ', $content , $header))
  126.  
  127. header('Location:index.php?send=true');
  128. else
  129. header('Location:index.php?send=false');
  130. }
  131. ?>


Tutaj jest błąd
  1. $stmt = $conn->exec("INSERT INTO Users ( ID , Nazwa , Haslo , mail , name , city , image , desci , activate , admin ) VALUES ('$userID','$userLogin', '$userPass', '$userMail', '$userName', '$userCity, $avatar', '$userDesc', 0 , 0 ");


Skąd wiem? Bo jak wykomentuje to skrypt leci do kolejnej lini i mam wyświetla się ok, z echa. Jeśli skasuje komentarz to przechodzi do instrukcji catch i z echa wyświetla się duppp.
viking
Jaki błąd? echo $e->getMessage();
Poza tym http://php.net/manual/en/pdo.prepare.php
Dukov
SQLSTATE[42000]: Syntax error or access violation: 1064 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 '' at line 1


Błąd składni widocznie, jakiś znak źle, ale sorry już mi się tak miesza, że nie dojdę sam do tego, więc jak ktoś mi to wytłumaczy łopatologicznie będę wdzięczny, tymbardziej, że skrypt logowania będę musiał dopracować (ale tamten działa, tylko przekierowania zrobić) do tego zahashować hasła i dopisać funkcje sprawdzającą, czy nie istnieje już taki plik. Z czy się nie powtarza ID już zrobiłem i nawet ładnie rekurencyjnie mi to wyszło :] no i wysłanie maila ogarnąć. A ostatnie tabele, admin itd, mam w tabeli jako boolean, choć z automatu mi dało TINYINT, a przed tymi kolumnami mam też KEY jako A_I, nie wiem czy nie powineinem tam dopisać pustej wartości czy coś.
viking
'$userCity, $avatar'

Poza tym id to nie wartość string jak to teraz zapisujesz. Zastosuj prepare i problem zniknie.
Dukov
Albo czegoś nie zrozumiałem albo jestem ślepy i czegoś nie widzę, pozmieniałem ale nadal to smao
  1. if($row['Nazwa'] == 0 && $row['mail'] == 0 ){
  2.  
  3. $stmt = $conn->prepare("INSERT INTO Users ( ID , Nazwa , Haslo , mail , name , city , image , desci , activate , admin ) VALUES ($userID,'$userLogin', '$userPass', '$userMail', '$userName', '$userCity', '$avatar', '$userDesc', 0 , 0 ");
  4. $stmt->execute();
  5. echo "ok";
  6. #$sendMail();
  7. }
viking
Naprawdę w dokumentacji jest to tak zapisane? Poza stosuj `` do nazw.
Dukov
Nie wiem jak jest w dokumentacji, ale siedzę przy kompie w zasadzie odkąd mam l4, czyli od 18 lipca z kilkoma przerwami na sen i już nie mam siły tam zajrzeć, a chciałbym, żeby to tylko działało. Na nauke przyjdzie pora, jak się wezmę za system komentarzy ale musze już odpocząć.
viking
https://dev.mysql.com/doc/refman/5.7/en/keywords.html
I poszukaj sobie name. Później zastosuj się do mojego poprzedniego wpisu.
Dukov
Majster, wszystko jest ok, tylko jak to ja, przeoczyłem zamknięcie nawiasów VALUES wink.gif
viking
Z kodu powyżej nie wynika żebyś miał problem z zamknięciem tylko ewidentnie słowo kluczowe. I zrób w końcu coś z tym sql injection. Wzorzec na weryfikację maila jest też jakimś przestarzałym badziewiem.
Tomplus
Tak jak mówi viking zainteresuj się funkcją do walidacji wartości:
http://php.net/manual/en/filter.examples.validation.php

Oraz hashowaniem hasła:
password_hash
Pyton_000
Cytat(viking @ 26.07.2017, 04:35:40 ) *
Z kodu powyżej nie wynika żebyś miał problem z zamknięciem tylko ewidentnie słowo kluczowe. I zrób w końcu coś z tym sql injection. Wzorzec na weryfikację maila jest też jakimś przestarzałym badziewiem.


No proooszę cię wink.gif Toż tam brakuje ) na końcu a nie żadne keyword.
Dukov

Hej, znowu będę Wam zawracał głowę smile.gif

Mam pewien problem oczywiście z bazą, nie działa to zapytanie
  1. $stmt = $conn->prepare("INSERT INTO articles (articleID, userID, author, title, artciletext, authorIP, createDate, editDate ) VALUES ('$articleID','$userID', '$user', '$title', '$articletext', '$ip' , '$date', '$modify')");



A tu cały kod

  1. <?php
  2. function checkExists($title){
  3.  
  4. try{
  5. $conn = new PDO("mysql:host=localhost;dbname=wojtecki", 'root', '');
  6. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $stmt = $conn->prepare("SELECT count(*) FROM articles WHERE title = '$title'");
  8. $stmt->execute();
  9. $row = $stmt->fetch();
  10. $result = $row[0];
  11.  
  12.  
  13. $conn = null;
  14. if($result <> 1){
  15. return 1;
  16. }
  17. else
  18. {
  19. header("Location: ../admin.php?id=news&news=exist");
  20. return;
  21. }
  22. }
  23. catch(PDOException $e){
  24. $e ->getMessage();
  25. echo $e;
  26. }
  27. }
  28. function checkID(){
  29.  
  30.  
  31.  
  32. try {
  33.  
  34. $len = 20;
  35. $articleID = substr(sha1(rand(1,10000)),0,$len);
  36.  
  37. $conn = new PDO("mysql:host=localhost;dbname=wojtecki", "root", "");
  38. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  39. $stmt = $conn->prepare("SELECT count(*) FROM articles WHERE articleID = '$articleID'");
  40. $stmt->execute();
  41. $row = $stmt->fetch();
  42. $result = $row[0];
  43. $conn = null;
  44. if ($result != 1){
  45. return $articleID;
  46.  
  47. }
  48. else{
  49. checkID();
  50. }
  51.  
  52.  
  53. }
  54. catch(PDOException $e)
  55. {
  56. $e->getMessage();
  57.  
  58.  
  59. }
  60.  
  61. }
  62. function getAuthor(){
  63.  
  64. try {
  65.  
  66.  
  67. $userID = $_SESSION['log'];
  68.  
  69.  
  70. $conn = new PDO("mysql:host=localhost;dbname=wojtecki", "root", "");
  71. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  72. $stmt = $conn->prepare("SELECT login, lastiplogin FROM users WHERE userID = '$userID'");
  73. $stmt->execute();
  74. $row = $stmt->fetch();
  75. $author = $row['login'];
  76. $authorArray["login"] = $author;
  77. $authorArray["userID"] = $userID;
  78. $authorArray['lastiplogin'] = $row['lastiplogin'];
  79. return $authorArray;
  80. $conn = null;
  81. }
  82. catch(PDOException $e)
  83. {
  84. $e->getMessage();
  85.  
  86.  
  87. }
  88.  
  89. }
  90.  
  91. function insertNews($articletext,$title){
  92.  
  93. try {
  94. echo 'dupa';
  95. $date = date("H.i d-m-Y");
  96. $modify = date("H.i d-m-Y");
  97. $articleID = checkID();
  98. $author = getAuthor();
  99. $userID = $author['userID'];
  100. $user = $author['login'];
  101. $ip = $author['lastiplogin'];
  102. $conn = new PDO("mysql:host=localhost;dbname=wojtecki", 'root', '');
  103. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  104. echo 'idartu'. $articleID;
  105. echo "<br>userID". $userID;
  106. echo "<br>autor". $user;
  107. echo "<br>title". $title;
  108. echo "<br>art". $articletext;
  109. echo "<br>ip". $ip;
  110. echo "<br>userID". $userID;
  111. $stmt = $conn->prepare("INSERT INTO articles (articleID, userID, author, title, artciletext, authorIP, createDate, editDate ) VALUES ('$articleID','$userID', '$user', '$title', '$articletext', '$ip' , '$date', '$modify')");
  112. $stmt->execute();
  113. $conn = null;
  114.  
  115. }
  116. catch(PDOException $e)
  117. {
  118. $e->getMessage();
  119. }
  120. }
  121. $title ='dupa';
  122. $articletext = 'fefefefefefefefwefefegrgewrrefwefegwecefa';
  123. $check = checkExists($title);
  124. if ($check == 1) {
  125. insertNews($articletext,$title);
  126. }
  127.  
  128. ?>



Wiem, że problem jest z zapytaniem, bo skrypt działa do miejsca, w którym wyświetlam zmienne, które mają być do niej wpisane, wrzuciłem je do echo, bo myślałem, że może któraś zmienna jest pusta albo z nimi jest problem, ale widzę, że wyświetla je, tak jakimi powinny być.
trueblue
Wydrukuj na ekran pełną treść zapytania (z podstawionymi zmiennymi) i wykonaj bezpośrednio na bazie (np. w PHPMyAdmin czy kliencie desktopowym).

P.S. Jeśli nie bindujesz wartości do zapytań, to prepare+execute jest zupełnie niepotrzebne, wystarczy exec. Ale oczywiście binduj, jeśli nie ufasz zawartości i pochodzeniu zmiennych.
Dukov
AuthorIP miałem jako INT, a w adresie są kropki. Dzięki, na przyszłość będę wiedział, że jak coś wygląda ok, to żeby sprawdzić sam SQL, aczkolwiek możesz mi powiedzieć, czy dobrze robię, ze każda funkcja, która potrzebuje coś z bazy łączy się z bazą? Czy lepiej napisać osobną funkcje do łączenia z bazą? Albo łączyć się tylko w głównej funkcji i wywoływać w niej pozostałe?

EDIT
Działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.