Tôi đang tạo một biểu mẫu đăng ký và tôi thực sự mới với nó. Tôi đã xem xét các vấn đề tương tự nhưng cảm thấy như tôi đã thiết lập đúng mã của mình, rõ ràng là tôi không
Tôi có một register_handler. php và một chức năng. tập tin php. Tôi chỉ đang cố chuyển một mảng [$errors[]] từ các hàm tạo ra chúng sang một hàm in chúng ra register_handler. php. Nó có vẻ rất dễ dàng, nhưng tôi không nhận được nó. Đây là mã của tôi
từ chức năng. php. [đây chỉ là một ví dụ về một trong các chức năng]
// USERNAME [MANDATORY] //uses the clean_names[] and checks for empty input function assign_username[] { global $conn; $username = $_POST['username']; if[!$username]{ $errors[] = "A username is mandatory"; echo "A username is mandatory
"; } else { $username = clean_names[$username]; } //check for duplicate username and return $username if doesn't exist already $username_check = mysqli_query[$conn, "SELECT username FROM users WHERE username='$username'"]; $number_rows = mysqli_num_rows[$username_check]; if[$number_rows > 0] { $errors[] = "Username already in use
"; echo "Username already in use
"; } else { return $username; } return $errors; } // END USERNAME
Cũng từ chức năng. php, chức năng in ra mảng lỗi
//display error array
function show_errors[$errors] {
print_r[$errors];
}
và chức năng gọi từ register_handler. php
if[isset[$_POST['register_button']]] {
//assign clean form variables
$firstname = assign_firstname[];
$lastname = assign_lastname[];
$username = assign_username[];
$email = assign_email[];
$password = assign_password[];
$date = date["Y-m-d"];
$errors = array[];
show_errors[$errors];
}
Tôi cố tình để lại tên người dùng để kiểm tra điều này trên biểu mẫu nhưng tôi chỉ được trả lại
Mảng[]
Nó lặp lại "Tên người dùng là bắt buộc" nhưng có vẻ như nó không chuyển chuỗi lỗi sang mảng lỗi
Bất cứ ai có thể chỉ cho tôi về những gì tôi đang làm sai, xin vui lòng. Tôi đánh giá cao các câu trả lời
Đã chỉnh sửa ngày 11 tháng 6 năm 2021 bởi TechnoDiver- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
Barand
Đăng ngày 11 tháng 6 năm 2021
Barand
- người điều hành
- 23. 4k
- 350
- Địa điểm. Cheshire, Vương quốc Anh
- Tuổi tác. 73
- quyên góp cho tôi
- Đăng lại
Đăng ngày 11 tháng 6 năm 2021
Có vẻ như bạn đang phân vân về việc các hàm gán_*[] của bạn sẽ trả về cái gì. Cái bạn hiển thị có thể trả về tên người dùng hoặc lỗi
Sẽ tốt hơn nếu trả về tên người dùng hoặc false nếu có lỗi và đưa lỗi vào mảng lỗi trong quá trình thực thi hàm, như trong ví dụ này
function assign_username[&$all_errors] /// pass the array by reference { global $conn; $username = $_POST['username']; $errors = []; if[!$username]{ $errors[] = "A username is mandatory"; } else { $username = clean_names[$username]; } //check for duplicate username and return $username if doesn't exist already $username_check = mysqli_query[$conn, "SELECT username FROM users WHERE username='$username'"]; $number_rows = mysqli_num_rows[$username_check]; if[$number_rows > 0] { $errors[] = "Username already in use
"; } if [$errors] { array_merge[$all_errors, $errors]; return false; } else return $username; } // END USERNAME // CALL THE FUNCTIONS $errors = []; $username = assign_username[$errors]; $lastname = assign_lastname[$errors]; $username = assign_username[$errors]; $email = assign_email[$errors]; show_errors[$errors];
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
macgyver
Đăng ngày 11 tháng 6 năm 2021
macgyver
- cựu nhân viên
- 5. 1k
- 102
- Đăng lại
Đăng ngày 11 tháng 6 năm 2021
vấn đề chính là do phạm vi biến cục bộ trong các hàm [mảng $errors bạn đang trả về đang được tạo lại bên trong mỗi lệnh gọi hàm] và trách nhiệm sai của mã hàm. các hàm do người dùng viết phải thực hiện những việc hữu ích [khối xây dựng] giúp bạn tạo ứng dụng [chúng không chứa mã dành riêng cho ứng dụng của bạn], chúng phải chấp nhận tất cả dữ liệu đầu vào dưới dạng tham số thời gian gọi và chúng sẽ trả lại kết quả cho mã gọi. nói tóm lại, chia nhỏ và gói mã chính của bạn bên trong các định nghĩa hàm, sau đó cần phải làm cho mọi thứ trở nên toàn cầu để nó hoạt động, chỉ là thêm nhiều thao tác gõ mà không thêm bất kỳ giá trị nào vào những gì bạn đang làm
đồng thời, bị chôn vùi trong bức tường mã này là một lỗi logic [có vẻ như nó đến từ w3schools] -
if[!$username]{ $errors[] = "A username is mandatory"; echo "A username is mandatory
"; } else { $username = clean_names[$username]; }
mã đó trước tiên đang kiểm tra xem giá trị thô có sai hay không, sau đó nó sẽ sử dụng bất kỳ chức năng nào mà hàm clean_names[] thực hiện với giá trị trong suốt phần còn lại của mã. dựa trên những gì mã w3schools đã thực hiện trong quá khứ, điều này sẽ cho phép một giá trị bao gồm tất cả các ký tự khoảng trắng vượt qua bài kiểm tra thô, nhưng sẽ sử dụng một chuỗi trống trong phần còn lại của mã. sửa đổi duy nhất mà bạn nên thực hiện đối với dữ liệu do người dùng gửi là cắt bớt dữ liệu, trước tiên, sau đó sử dụng giá trị đã cắt đó trong toàn bộ phần còn lại của mã
để kiểm tra xem tên người dùng [hoặc bất kỳ giá trị duy nhất nào khác] đã tồn tại hay chưa, hãy xác định cột là một chỉ mục duy nhất, chỉ cần cố gắng chèn dữ liệu, sau đó phát hiện xem có xảy ra lỗi chỉ mục trùng lặp hay không. bằng cách thử chọn dữ liệu trước tiên, sẽ có một khoảng thời gian mà hàng chục truy vấn có thể được thực thi, sau đó có thể lấy giá trị mà bạn cho là không được sử dụng
bạn cũng nên sử dụng một truy vấn đã chuẩn bị khi cung cấp các giá trị động, không xác định, bên ngoài cho một truy vấn khi nó được thực thi
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thợ lặn kỹ thuật
Đăng ngày 11 tháng 6 năm 2021
thợ lặn kỹ thuật
- Các thành viên
- 203
- 2
- Tác giả
- Đăng lại
Đăng ngày 11 tháng 6 năm 2021
Barand, tôi đã đọc về các biến tham chiếu và tôi hiểu nó về nguyên tắc nhưng có lẽ không hoàn toàn trong thực tế. Không chắc tôi hiểu việc sử dụng nó ở đây
Tôi có một vài câu hỏi nếu bạn không phiền - 1] lỗi[] cần được chỉ định trong mọi chức năng sử dụng nó VÀ trong register_handler. php cũng như được tham chiếu trong các tham số?
2] Điều gì đang xảy ra bên trong chương trình khi nó chạy trả về giá trị sai;
3] Bạn có thể cung cấp cho tôi bản phân tích ELI5 về lý do tại sao việc tham chiếu biến được thực hiện ở đây và cách thức hoạt động của nó trong suốt phần còn lại của chương trình, chỉ khi bạn có thời gian và ý chí, không có áp lực ở đó
Tôi nhận được kết quả tương tự với mã của bạn giống như cách tôi đã thực hiện nó [chỉ lấy Array[] làm đầu ra không có nội dung] và tôi nghĩ rằng một khi tôi cảm thấy thoải mái hơn với các vấn đề được đề cập ở trên thì tôi có thể . Cảm ơn một lần nữa
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
Barand
Đăng ngày 11 tháng 6 năm 2021
Barand
- người điều hành
- 23. 4k
- 350
- Địa điểm. Cheshire, Vương quốc Anh
- Tuổi tác. 73
- quyên góp cho tôi
- Đăng lại
Đăng ngày 11 tháng 6 năm 2021
Đây là một ví dụ đơn giản hơn một chút về việc đạt được điều tương tự
$errors = []; // create empty array to accumulate all errors $a = functionA[$errors]; // call the functions $b = functionB[$errors]; // passing the error array $c = functionC[$errors]; // so they can add to it if [$errors] { show_errors[$errors]; } else { echo "$a - $b - $c
"; } // normally when passing a variable to a function // the value is copied to the variable used by the function. // In this case we pass the array *by reference* // so that the original array is used and not a copy. function functionA[&$all_errors] // that way we can accumulate all the errors in the one array { $hasErrs = 0; if [rand[1, 3]==1] { $all_errors[] = 'A error'; // write any error messages into the error array $hasErrs = 1; } if [$hasErrs] { // if there are errors return false; // a common convention is to return false when a function fails with errors } return 1; } function functionB[&$all_errors] { $hasErrs = 0; if [rand[1, 3]==2] { $all_errors[] = 'B error'; $hasErrs = 1; } if [$hasErrs] { return false; } return 2; } function functionC[&$all_errors] { $hasErrs = 0; if [rand[1, 3]==3] { $all_errors[] = 'C error'; $hasErrs = 1; } if [$hasErrs] { return false; } return 3; } function show_errors[$errors] { echo "You had errors"
; foreach [$errors as $e] { echo "$e "; } echo ""; }
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thợ lặn kỹ thuật
Đăng ngày 12 tháng 6 năm 2021
thợ lặn kỹ thuật
- Các thành viên
- 203
- 2
- Tác giả
- Đăng lại
Đăng ngày 12 tháng 6 năm 2021
Trích dẫn
Đây là một ví dụ đơn giản hơn một chút về việc đạt được điều tương tự
Tôi đã có một tiếng cười tốt về điều này. Theo quan điểm của tôi, nó không có vẻ đơn giản hơn. Tôi đã sao chép nó để phân tích sau và tôi đã so sánh nó với ví dụ trước của bạn
Tôi đã xem qua mã sửa đổi của mình, dựa trên ví dụ đầu tiên của bạn và bây giờ tôi hoàn toàn hiểu nó, cảm ơn vì ví dụ mới. Lý do để tham chiếu biến bây giờ cũng rõ ràng hơn
Tôi đang thực hiện một hướng dẫn dạy PHP thông qua một dự án CMS. Tôi dành một chút thời gian cho tut sau đó cố gắng chuyển kiến thức đó vào một dự án cá nhân mà tôi đang thực hiện, đây là mẫu đăng ký cuối cùng cho. Tôi đã chỉnh sửa mã của mình dựa trên các khái niệm mà bạn đã giới thiệu cho tôi trong ví dụ đầu tiên của bạn và có mã này
trong các chức năng. php -
// USERNAME [MANDATORY] //uses the clean_names[] and checks for empty input function assign_username[&$all_errors] { global $conn; $username = $_POST['username']; $errors = []; if[$username] { $username = clean_names[$username]; //i've tried this in the negative too "if[!$username]...." } else { $errors[] = "A username is mandatory"; echo "A username is mandatory
"; } //check for duplicate username and return $username if doesn't exist already $username_check = mysqli_query[$conn, "SELECT username FROM users WHERE username='$username'"]; $number_rows = mysqli_num_rows[$username_check]; if[$number_rows > 0] { $errors[] = "Username already in use
"; echo "Username already in use
"; } if[$errors] { array_merge[$errors, $all_errors]; //i've tried this with $errors = array_merge[....] and still didn't work return false; //if I use echo ".." it echos but shows an empty array } else { return $username; } } // END USERNAME
và
//display error array
function show_errors[$errors] {
print_r[$errors];
}
và register_handler. php trông như thế này
________số 8Khi tôi bắt đầu cảm thấy thoải mái hơn với PHP, tôi gặp phải một vấn đề như thế này. Tôi rõ ràng vẫn cần một số công việc chuyển dữ liệu giữa các chức năng và các tệp khác, tôi nghĩ rằng tôi đã hiểu nó, mã này có vẻ hoạt động với tôi nhưng nó vẫn hiển thị Array[] là đầu ra không có nội dung. Tôi đã thử một câu lệnh 'tiếng vang' ở mọi nơi được cho là sẽ xảy ra và luôn nhận được tiếng vang, vì vậy một phần của mã đang chạy, nhưng "Tên người dùng là bắt buộc" không được chèn vào mảng $errors[]. Còn gì nữa không?
Tôi lập một danh sách kiểm tra trong đầu về cách tôi hiểu cách dữ liệu di chuyển -> mảng được chỉ định trong cả tệp và hàm, đặt tham số hàm, thêm chuỗi vào mảng, gửi mảng tới hàm in và gọi . Tôi không thể hiểu có thể cần phải làm gì nữa, rõ ràng là có điều gì đó, nhưng tôi không nhìn thấy nó. Tôi đã bỏ lỡ điều gì?
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
Barand
Đăng ngày 12 tháng 6 năm 2021
Barand
- người điều hành
- 23. 4k
- 350
- Địa điểm. Cheshire, Vương quốc Anh
- Tuổi tác. 73
- quyên góp cho tôi
- Đăng lại
Đăng ngày 12 tháng 6 năm 2021
Tôi xin lỗi [đổ lỗi cho tuổi tác - tôi đoán tôi đã có một khoảnh khắc "cao cấp"]
array_merge[$all_errors, $errors];
nên là
//display error array
function show_errors[$errors] {
print_r[$errors];
}
0
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thợ lặn kỹ thuật
Đăng ngày 12 tháng 6 năm 2021
thợ lặn kỹ thuật
- Các thành viên
- 203
- 2
- Tác giả
- Đăng lại
Đăng ngày 12 tháng 6 năm 2021
Điều đó chỉ làm hỏng mọi thứ mà tôi nghĩ rằng tôi đã hiểu về các tài liệu tham khảo trong trường hợp này. Nó cũng dạy tôi thử mọi thứ và không cho rằng thứ gì đó sẽ không hoạt động vì tôi không thể hiểu nó hoạt động như thế nào
Tôi đã thử $errors = array_merge[. ];
Cảm ơn bạn, bạn đã giúp đỡ rất nhiều, nhưng nếu bạn không phiền thì hãy cho tôi biết - tại sao $all_errors lại ở đây?
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thợ lặn kỹ thuật
Đăng ngày 12 tháng 6 năm 2021
thợ lặn kỹ thuật
- Các thành viên
- 203
- 2
- Tác giả
- Đăng lại
Đăng ngày 12 tháng 6 năm 2021
vì vậy tôi không muốn bắt đầu một chủ đề mới cho chủ đề này và tôi không thể thêm nó vào bài đăng cuối cùng của mình. Tôi không cố tỏ ra quá thông minh với chương trình nhưng tôi quyết định thử một thứ gì đó để giúp tôi hiểu thêm cách dữ liệu di chuyển giữa các hàm
Tôi đã lấy mã bạn đã giúp tôi và tạo một chức năng từ đó ->
//display error array
function show_errors[$errors] {
print_r[$errors];
}
1đó là một chức năng nội bộ được sử dụng trong các chức năng gán tên người dùng, email và mật khẩu
//display error array
function show_errors[$errors] {
print_r[$errors];
}
2Và đây là một ví dụ khác về việc ngay khi tôi bắt đầu cảm thấy thoải mái với điều gì đó, tôi đã chứng minh rằng mình đã sai. Tôi thấy thực sự bực bội vì tôi cảm thấy rằng tôi có thể hình dung dữ liệu di chuyển qua các chức năng nhưng tại sao cách trên không hoạt động?
Tôi ghét phải là người cứ hỏi đi hỏi lại về cùng một điều, nhưng tôi thực sự muốn hiểu cách dữ liệu di chuyển trong một ứng dụng web và tôi cảm thấy một cách hay là để mọi người trả lời thay vì xử lý tất cả sau này thành một thứ gì đó. . Người đó có thể chỉ để lại một phản hồi đột nhiên bật bóng đèn lên
Nói tất cả những điều đó. Có gì sai với chức năng này, xin vui lòng?
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
người sải bước64
Đăng ngày 13 tháng 6 năm 2021
người sải bước64
- Các thành viên
- 379
- Địa điểm. Một khu vực của Detroit, MI
- Đăng lại
Đăng ngày 13 tháng 6 năm 2021 [đã chỉnh sửa]
Cá nhân tôi chỉ viết các chức năng mà tôi cố gắng thực hiện một việc và gửi nó trở lại chương trình chính. Đây là một ví dụ về những gì tôi đang nói về
//display error array
function show_errors[$errors] {
print_r[$errors];
}
3Tôi kiểm tra tên người dùng đối với bảng cơ sở dữ liệu rồi gửi và trả lại mảng. Vâng, tôi biết nó chỉ có một chỉ mục trong mảng, nhưng sau đó tôi có thể sử dụng chỉ mục đó cho mã khác như mảng xác thực chẳng hạn?
Đã chỉnh sửa ngày 13 tháng 6 năm 2021 bởi Strider64- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
Barand
Đăng ngày 13 tháng 6 năm 2021
Barand
- người điều hành
- 23. 4k
- 350
- Địa điểm. Cheshire, Vương quốc Anh
- Tuổi tác. 73
- quyên góp cho tôi
- Đăng lại
Đăng ngày 13 tháng 6 năm 2021 [đã chỉnh sửa]
12 giờ trước, TechnoDiver đã nói
Có gì sai với chức năng này, xin vui lòng?
Nó không thực hiện bất kỳ kiểm tra nào
Bạn tạo, trong hàm, một mảng $error cục bộ trống, sau đó mã của bạn cho biết "nếu mảng [trống] này không trống, hãy thêm mảng trống vào mảng $all_errors
Bạn nên
//display error array
function show_errors[$errors] {
print_r[$errors];
}
4Được chỉnh sửa vào ngày 13 tháng 6 năm 2021 bởi Thương hiệu
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thợ lặn kỹ thuật
Đăng ngày 14 tháng 6 năm 2021
thợ lặn kỹ thuật
- Các thành viên
- 203
- 2
- Tác giả
- Đăng lại
Đăng ngày 14 tháng 6 năm 2021
lỗi tân binh, cảm ơn
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thợ lặn kỹ thuật
Đăng ngày 15 tháng 6 năm 2021
thợ lặn kỹ thuật
- Các thành viên
- 203
- 2
- Tác giả
- Đăng lại
Đăng ngày 15 tháng 6 năm 2021 [đã chỉnh sửa]
Vào ngày 13/6/2021 lúc 5. 21 giờ sáng, Strider64 đã nói
Cá nhân tôi chỉ viết các chức năng mà tôi cố gắng thực hiện một việc và gửi nó trở lại chương trình chính. Đây là một ví dụ về những gì tôi đang nói về
//display error array function show_errors[$errors] { print_r[$errors]; }
5Tôi kiểm tra tên người dùng đối với bảng cơ sở dữ liệu rồi gửi và trả lại mảng. Vâng, tôi biết nó chỉ có một chỉ mục trong mảng, nhưng sau đó tôi có thể sử dụng chỉ mục đó cho mã khác như mảng xác thực chẳng hạn?
Cảm ơn bạn đã phản hồi, tôi đã không nhận thấy nó cho đến bây giờ. Tôi vẫn đang giải mã nó
Vào ngày 13/6/2021 lúc 6. 43 giờ sáng, Barand nói
Nó không thực hiện bất kỳ kiểm tra nào
Bạn tạo, trong hàm, một mảng $error cục bộ trống, sau đó mã của bạn cho biết "nếu mảng [trống] này không trống, hãy thêm mảng trống vào mảng $all_errors
Barand, tôi phải làm việc khác trong vài ngày nên tôi sẽ quay lại vấn đề này
Tôi đã thấy lỗi khi gán một mảng trống và kiểm tra xem nó có trống không ngay sau đó. Đó chắc chắn là một sai lầm tân binh
Nhưng vẫn có cái gì đó không nhấp
1. Tôi đã kiểm tra lỗi trong hàm gán_field[] [trong trường hợp này là $password]
2. Tôi đã gọi hàm check_errors với các tham số phù hợp
3. Hàm check_errors[] kiểm tra một mảng trống, hợp nhất chúng với các mảng khác nếu chúng tồn tại hoặc trả về trường $ nếu mọi thứ đều ổn
tôi thực sự bối rối. Tôi không chắc bạn còn gợi ý tôi cần làm gì nữa
Đây là mã như bây giờ
//display error array
function show_errors[$errors] {
print_r[$errors];
}
6và check_errors
//display error array
function show_errors[$errors] {
print_r[$errors];
}
7Tôi đã xem đi xem lại nó hàng chục lần trong đầu, cố gắng nhẩm trong đầu xem chính xác dữ liệu đang làm gì ở mỗi bước, tạm gác nó đi một thời gian để nghiên cứu các lĩnh vực khác của PHP với hy vọng có được AH HA. lúc này, hãy đọc qua 'mã giả' trong nhận xét cuối cùng của bạn, hãy truy cập Edabit để thực hành với các chức năng. Tôi vẫn không thể thấy điều gì sai ở đây và tôi chắc chắn đó là một vấn đề cơ bản. Đó có phải là một thất bại trong logic của tôi?
Đã chỉnh sửa ngày 15 tháng 6 năm 2021 bởi TechnoDiver- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
Barand
Đăng ngày 15 tháng 6 năm 2021
Barand
- người điều hành
- 23. 4k
- 350
- Địa điểm. Cheshire, Vương quốc Anh
- Tuổi tác. 73
- quyên góp cho tôi
- Đăng lại
Đăng ngày 15 tháng 6 năm 2021
Khi bạn gọi check_errors[] từ bên trong các hàm của mình, bạn đang chuyển mảng lỗi cục bộ được tạo bên trong hàm chứ không phải mảng lỗi chính mà bạn muốn tích lũy tất cả các lỗi trong đó. Vì vậy, nó chỉ tích lũy chúng trong mảng cục bộ đó và chúng bị mất khi chức năng kết thúc