alexandre Posted November 20, 2022 Share Posted November 20, 2022 so i have this here: $voucher_code = rand(1, 100000000000000000); if ($stmt = $con->prepare('SELECT voucher_code FROM voucher_codes')) { $stmt->bind_param('i', $voucher_code); $stmt->execute(); $voucher_codes = mysqli_query($con, $stmt); while (mysqli_num_rows($voucher_codes) > 0) { shuffle($voucher_code); } if (mysqli_num_rows($voucher_codes) == 0) { $voucher_code_unique = $voucher_code; }} i did not tested it yet , i wanted to know some opinions (if posible for mysqli extension), so what i doubt about this code would be that the query doesnt compare with the shuffled voucher code after it is getting shuffled in case of a duplicated record. if so i would end in a endless loop of same queries to redo and recompare the new generated voucher code from the shuffle function. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/ Share on other sites More sharing options...
requinix Posted November 20, 2022 Share Posted November 20, 2022 Putting aside that your code will not work as it is, and that this is very likely the wrong solution for what you're trying to do, You're dealing with numbers up to 17 digits long. Unless you're generating millions of these, you're not realistically going to get a duplicate. Put it into a loop and it'll work. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602750 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 yeah you are right but i have the bad habit to always encounter unprobable things so i was just trying to prevent in case this happens. but what would not work in this code as it is? i know there might be errors i just did this quickly trying to figure the most suitable way to handle this. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602751 Share on other sites More sharing options...
Barand Posted November 20, 2022 Share Posted November 20, 2022 2 hours ago, alexandre said: but what would not work in this code as it is? The shorter answer would be to the question "What would work?" Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602752 Share on other sites More sharing options...
requinix Posted November 20, 2022 Share Posted November 20, 2022 3 hours ago, alexandre said: what would not work in this code as it is? Your query binds a parameter it doesn't use, you loop on whether it rows thus it'll either loop forever or not at all, and you're attempting to shuffle a number. I was hoping you would pay more attention to the part of my post where I said "likely the wrong solution" and less so on the "will not work as is". Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602753 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 yes i think i should have asked what would work if this is not the good way to go about it ,. and i am always trying to understand whats wrong from where i asked what was wrong with the code it would help to identify an error that i dont want to make again.. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602756 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 3 hours ago, requinix said: Your query binds a parameter it doesn't use, you loop on whether it rows thus it'll either loop forever or not at all, and you're attempting to shuffle a number. I was hoping you would pay more attention to the part of my post where I said "likely the wrong solution" and less so on the "will not work as is". you are right i didnt put a where clause... Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602757 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 about shufling a number generated randomly using range , i thought that if i shuffled the number it would give a new number in that range but , it seems like we cant do this. what would be your way of doing this ? i find it intriguing since this seems quite a simple solution if i make it right no? Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602758 Share on other sites More sharing options...
Barand Posted November 20, 2022 Share Posted November 20, 2022 If you ever get around to looking at the PHP manual and look up "shuffle()" yo will see its description is This function shuffles (randomizes the order of the elements in) an array. As it is randomising what you already have (ie a random number) what are you gaining? The second thing to note in the description is that it is for shuffling the elements of an array, not the characters in a string. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602759 Share on other sites More sharing options...
Barand Posted November 20, 2022 Share Posted November 20, 2022 1 hour ago, alexandre said: yes i think i should have asked what would work Answer: The first line only. The rest is a hotch-potch of pasted code with no thought for what each line does or what the variables contain. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602761 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 6 minutes ago, Barand said: Answer: The first line only. The rest is a hotch-potch of pasted code with no thought for what each line does or what the variables contain. thats not true , i thought about the behavior of what i was trying to do should be but obviously i didnt read the manual for the shuffle function , i saw it in an example somewhere on a forum while looking for an answer already answered but he was doing this shuffle($numbers) in the answer so i just assumed it was a shuffling function. and for the rest i dont see why it is what you said hotch-potch ? yes i save time by going in my other files and taking a part of code that i need sometimes but for the most part i dont copy paste only. the idea behind it makes sense for me .. i just was looking for theorical enlightement to have a better understanding and it seems like it worked .😅 Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602763 Share on other sites More sharing options...
ginerjm Posted November 20, 2022 Share Posted November 20, 2022 Do you know how to read the manual to understand how functions work? You are demonstrating not much of a capability to program with this example. Let me add some comments that might make you see what you are doing here. I am being rough but you already have an open topic on this forum and like some other people here you have begun a new adventure that is sending you off in a peculiar direction while your first topic is still hanging. $voucher_code = rand(1, 100000000000000000); // You are seeking a random number in a range that most systems can't even fathom due to integer size limits // per the PHP manual the max int is: 9223372036854775807 and you are exceeding that if ($stmt = $con->prepare('SELECT voucher_code FROM voucher_codes')) // you are querying for every row in your voucher_codes table { $stmt->bind_param('i', $voucher_code); // you are binding a value to what ???? $stmt->execute(); // you have just run your query $voucher_codes = mysqli_query($con, $stmt); // and now you are running your query again while (mysqli_num_rows($voucher_codes) > 0) { shuffle($voucher_code); // you are shuffling a single digit that was selected at random and has nothing to do with the query // Over and Over and Over and Over and Over...... } if (mysqli_num_rows($voucher_codes) == 0) { $voucher_code_unique = $voucher_code; // since your query resulted in no hits (how could that be?) you // are assigning your random number to a desired variable that // you don't assign a 'hit' to when there are any } } // all of the code above is only run if your prepare 'works' // What are you going to do if the prepare fails? AND in your response to my critique (criticism?) PLEASE don't re-post my post. We can all see it here. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602764 Share on other sites More sharing options...
Barand Posted November 20, 2022 Share Posted November 20, 2022 @ginerjm Please use PHP code type for your PHP code. This enables the format highlighting features (such as the comments above). I have edited this one for you. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602766 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 first of all you attack me about something that i wasnt even done writing , i was asking for opinions to be sure i was going the right way ., which i got, and now i will go work on it , no need of telling me that i dont know to do nothing in programming , and yes i was extremely tired last night and didnt pay much attention so i am sorry for asking for enlightment for no reason.. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602767 Share on other sites More sharing options...
Barand Posted November 20, 2022 Share Posted November 20, 2022 6 minutes ago, ginerjm said: per the PHP manual the max int is: 9223372036854775807 and you are exceeding that I don't see how... 100000000000000000 9223372036854775807 9 minutes ago, ginerjm said: $voucher_codes = mysqli_query($con, $stmt); // and now you are running your query again He isn't running it again - he attempting to run a query on a statement object instead of a string of SQL. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602768 Share on other sites More sharing options...
ginerjm Posted November 20, 2022 Share Posted November 20, 2022 Nice pickup Barand. First I miscount the digits and then I don't read the code completely, just assume that an execute followed by a query was a needless thing. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602771 Share on other sites More sharing options...
Barand Posted November 20, 2022 Share Posted November 20, 2022 That query statement is an example of what I said about the code... 49 minutes ago, Barand said: no thought for what each line does or what the variables contain Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602772 Share on other sites More sharing options...
mac_gyver Posted November 20, 2022 Share Posted November 20, 2022 the OP is trying to do this activity by rote, by memorization, by appearance, not though actually learning (internalizing) the meaning of the words and syntax. this produces a result that is only as good as his memory recall is. the mysqli_query() call on the prepared query statement object is the same misusage at the start of a previous recent thread, which @requinix hinted/asked (Jeopardy theme can be heard playing in the background) if the OP actually wanted to do this. one would assume that since the OP removed this statement in that thread that he would have learned something by doing so, but since the OP is doing this by repeating pictures of the words, no learning occurred, hence the repeated mistake. @alexandre, writing code actually means writing the words and syntax of the language you are using, so that they result in an understandable story that when the computer executes them they do something useful. to do this you must actually learn the meaning of the words and syntax, not just repeat, copy/pasting things together based on what you have seen. somehow, you must make this transition in how you are approaching this activity. instead of just seeing and repeating a picture of the words, you must actually learn the meaning of the words, so that you know what they do or even if they belong in the current task. Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602785 Share on other sites More sharing options...
mac_gyver Posted November 20, 2022 Share Posted November 20, 2022 (edited) what your code should do for this activity is generate a random number, then do what is described in this post - https://forums.phpfreaks.com/topic/315552-php-mysql-returns/#comment-1602746 to just attempt to insert that random number into the table. if the code continues past the point where the INSERT query is executed, you know that the generated number was unique and was inserted into the table. if the code transfers execution to the exception catch block and the error number is for a duplicate index, instead of setting up a message for the user that there was a duplicate, you would cause the code to loop back to the start, where it would generate a new random number and attempt to execute the insert query again. i would use a loop counter, of about 10, so that a programming mistake or the random number generator doesn't work very well (the rand() documentation mentions that the maximum on windows is a 32bit number, not a double-int) to force an exit if the operation doesn't succeed. Edited November 20, 2022 by mac_gyver Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602786 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 maybe this should look better $voucher_code = rand(0, 1000000000000000000); $stmt = $con->prepare('SELECT voucher_code FROM voucher_codes WHERE voucher_status = 1'); $voucher_codes = mysqli_query($con, $stmt); if (mysqli_num_rows($voucher_codes) > 0) { while ($voucher_rows = mysqli_fetch_assoc($voucher_codes)) { if ($voucher_code === $voucher_codes) { unset($voucher_code); $voucher_code = rand(0, 1000000000000000000); } else if ($voucher_code != $voucher_codes) { $voucher_code_unique = $voucher_code; } } } and yes im starting to get the difference with mysqli objects.. i think so 😅 Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602789 Share on other sites More sharing options...
alexandre Posted November 20, 2022 Author Share Posted November 20, 2022 (edited) 1 hour ago, mac_gyver said: what your code should do for this activity is generate a random number, then do what is described in this post - https://forums.phpfreaks.com/topic/315552-php-mysql-returns/#comment-1602746 to just attempt to insert that random number into the table. if the code continues past the point where the INSERT query is executed, you know that the generated number was unique and was inserted into the table. if the code transfers execution to the exception catch block and the error number is for a duplicate index, instead of setting up a message for the user that there was a duplicate, you would cause the code to loop back to the start, where it would generate a new random number and attempt to execute the insert query again. i would use a loop counter, of about 10, so that a programming mistake or the random number generator doesn't work very well (the rand() documentation mentions that the maximum on windows is a 32bit number, not a double-int) to force an exit if the operation doesn't succeed. i will take a better look at this , this seems to be the behavior i wish to produce. also my choucher_code collumn is already a unique one Edited November 20, 2022 by alexandre Quote Link to comment https://forums.phpfreaks.com/topic/315557-how-to-generate-a-random-num-and-make-sure-it-is-unique-before-running-through-next-condition/#findComment-1602790 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.